본문 바로가기
PS/BOJ

[자바] 백준 12981 - 공 포장하기 (boj java)

by Nahwasa 2022. 5. 8.

문제 : boj12981

 

 

  당연히 3개씩 넣는게 가장 좋으며, 그게 안된다면 2개씩, 그것도 안된다면 1개씩이라도 넣으면 된다. 이건 당연한건데 문제는 박스에 들어가는 공의 색은 모두 다르거나, 모두 같아야 한다는 제약때문에 순서를 잘 정해야 한다.

 

  내 경우 이하의 로직으로 풀었다.

1. 우선 가능한 만큼 모두 다른색으로 3개를 박스에 넣는다. (따라서 정렬 후, 가장 낮은 값을 나머지 2개에서 빼줬다.)

 

2. 이제 3개씩 넣을 수 있는 방법은 모두 같은 색으로 3개를 넣는 방법 뿐이다. 따라서 남은 2개의 색상은 각각 3개씩 가능한 만큼 넣어준다.

 

3. '2'에서 남은 공운 1개 아니면 2개일 것이다(3개씩 넣었으므로). 이 때 가능한 경우는 다음과 같다.

3.1 둘다 남은게 0개인 경우 -> 모두 3개씩 들어간 경우이다. 1~2에서 구한것만 출력해주면 된다.

3.2 한쪽이 남은게 0인 경우 -> 나머지 하나를 상자 하나에 넣어주면 된다. 1~2에서 구한 값 + 1을 출력해주면 된다.

3.3 둘 다 1개씩 남은 경우 -> 이 경우 2개짜리 상자 하나만 있으면 된다. 마찬가지로 +1을 출력해준다.

3.4 이제 남은 경우는 둘 다 2개인 경우와 둘이 1개와 2개가 남은 경우 -> 이 경우엔 +2를 해줘야 한다.

 

위 로직대로 구현을 해주면 된다.

 

 

코드 : github

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
    private void solution() throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int[] arr = new int[3];
        for (int i = 0; i < 3; i++) arr[i] = Integer.parseInt(st.nextToken());
        Arrays.sort(arr);
        int cnt = arr[0];
        arr[1]-=arr[0];
        arr[2]-=arr[0];
        cnt += arr[1]/3 + arr[2]/3;
        cnt += arr[1]%3!=0 ? 1 : 0;
        cnt += arr[2]%3!=0 ? 1 : 0;
        if (arr[1]%3 == 1 && arr[2]%3 == 1)
            cnt--;
        System.out.println(cnt);
    }

    public static void main(String[] args) throws Exception {
        new Main().solution();
    }
}

댓글