2 minute read




문제 풀이


문재의 지문은 어려워 보이지만 테스트케이스를 잘 보면 쉽게 풀 수 있다.
요구하는 내용을 잘 살펴보면 1번, 2번, 3번 음식을 몇 번 먹었는지를 ‘데칼코마니’처럼 “0”을 사이에 두고 출력하면 된다.


아이디어 도출

  • food 배열의 1번째 음식인 1번째 원소부터 2명이서 나누어 먹을 수 있는지를 확인하며 남는 음식은 신경쓰지 않고 2명에게 분배한다.
  • 두명 모두 같은 음식 배치로 음식을 먹어야 하기에 첫번째 선수의 음식 배치를 거꾸로하면 두번째 선수의 음식 배치가 된다.
    • 결국, 첫번째 선수의 음식 배치만 구하면 두번째 선수의 음식배치는 별도로 구하지 않아도 된다.
  • 주어지는 food 배열의 0번째 원소, 즉 물의 양은 1로 고정이기에 신경쓰지 않아도 된다.


아이디어를 장황하게 작성하긴 했지만, 목적은 단순하다.
핵심은 2명 중 첫번째 선수의 음식 배치를 구하면 두번째 선수의 음식배치는 반대로 하면 구할 수 있다는 것이다.
바로 코드를 작성해보자.

1
2
StringBuilder res = new StringBuilder();
StringBuilder first_player = new StringBuilder();

StringBuilder를 활용하여 음식 배치를 담으려 한다.
먼저 두 선수의 음식 배치를 담을 res와 첫번째 선수의 음식배치를 담을 first_player를 선언하자.

왜 첫번째 선수의 음식배치를 담을 StringBuilder를 별도로 만들었나?
첫번째 선수의 음식 배치를 구하고 이를 반대로 뒤집어서 두번째 선수의 음식배치를 구해야 하는데, 물인 “0”을 중간에 추가한다면 첫번째 선수의 음식배치에 “0”이 포함된 채로 뒤집어지기 때문에 별도로 2개의 StringBuilder에 담았다.


1
2
3
4
5
6
for(int i=1; i<food.length; i++) {
    for(int j=0; j<food[i]/2; j++) {
        res.append(i);
        first_player.append(i);
    }
}

다음으로 첫번째 선수의 음식 배치를 구한다. food 배열에서 1번음식부터 N번째 음식이 몇가지 준비되었는지 확인하고
2명의 선수가 나눠먹도록 N번째 음식을 2로 나누어 분배한다. 결국 첫번째 선수가 먹어야할 음식배치를 구할 수 있게 된다.
또한, 이중 for문 종료후 반대로 뒤집어 두번째 선수의 음식배치를 구하기 위해 첫번째 선수의 음식배치도 함께 담는다.

1
2
3
first_player.reverse();
res.append("0");
res.append(first_player.toString());

마지막으로 첫번째 선수의 음식배치를 반대로 뒤집어 두번째 선수의 음식배치를 구한다.
그리고 물의 배치를 추가해야 하기에 “0”을 미리 첫번째 선수 음식배치를 담아놓았던 res StringBuilder에 추가한 후, 위에서 구한 두번째 선수의 음식배치를 마지막으로 추가하면 된다.



작성 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import java.util.*;

class Solution {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int[] food = {1,3,4,6};
        // int[] food = {1,7,1,2};
        // int[] food = {1,5,3,4};

        long start = System.currentTimeMillis();
        solution(food);
        long end = System.currentTimeMillis();
        System.out.println("\n수행시간 = " + (end-start));
    }
    
    public static String solution(int[] food) {
        StringBuilder res = new StringBuilder();
        StringBuilder first_player = new StringBuilder();

        for(int i=1; i<food.length; i++) {
            for(int j=0; j<food[i]/2; j++) {
                res.append(i);
                first_player.append(i);
            }
        }
        
        first_player.reverse();
        res.append("0");
        res.append(first_player.toString());

        return res.toString();
    }
}

회고

  • 알고리즘과 관련된 내용은 아니지만 ‘데칼코마니’ 방식으로 문제를 풀기위한 아이디어를 생각해낼 수 있었다.