알고리즘

[백준, 자바, 1057번] 토너먼트

hminor 2024. 11. 9. 22:23
반응형

풀이

  • 해당 문제를 풀면서 역시 대충 예상하고 풀지말자라고 다시 느끼게 됨.
  • 처음에 문제 아래에 서로 붙지 않는 경우엔 -1을 하라고 했지만
  • 토너먼트인데 서로 붙지 않는 경우가 있을까 해서
  • 예외처리 하지 않고 했는데 계속 실패
  • 그리고 무조건 앞의 친구가 작을 것으로 대충 생각하고 해서 실패
  • 이러한 작은 것들이 하나 둘씩 생각 안하고 풀어 제끼니 계속 틀리지 싶어서 반성...
  • 무튼 해당 문제는 위의 것들을 고려하고, N을 계속 2로 나누며 범위를 탐색했고,
  • 만약 N이 홀수의 경우엔 가장 마지막 값을 따로 추가 해주면서 아래와 같이 해결.

 

import java.io.*;
import java.util.*;

public class _1057 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int X = Integer.parseInt(st.nextToken());
        int Y = Integer.parseInt(st.nextToken());
        if (X>Y) {
            int tmp = X;
            X=Y;
            Y=tmp;
        }

        List<Integer> li = new ArrayList<>(N+1);
        List<Integer> now;
        for (int i=1; i<=N; i++) li.add(i);
        int result = 1;
        boolean state = false;
        while (N!=1) {
            now = new ArrayList<>();
            for (int i=0; i<N/2; i++) {
                if (li.get(i*2)==X && li.get(i*2+1)==Y) {
                    state = true;
                    break;
                }
                else if (li.get(i*2+1)==X || li.get(i*2+1)==Y) now.add(li.get(i*2+1));
                else now.add(li.get(i*2));
            }
            if (N%2!=0) now.add(li.get(li.size()-1));
            if (state) break;
            li = new ArrayList<>(now);
            if (N%2==0) N/=2;
            else N = N/2+1;
            result++;
        }
        System.out.println(state?result:-1);
    }
}