백준 1057번 토너먼트[도움]

작성자 : 조회수 :

부르트포스 풀이법으로 접근하였으나

 

30분이상 고민해보고 풀어봤음에도 감을 잡지 못하여 다른 풀이를 참고하여 도움을 받았습니다.

 

제가 했던 접근방식은 어렵게 접근하였고 문제를 약간 무시하다 싶은 정도의 낮은 이해력으로

 

풀지 못한 것 같습니다.

 

다시 한번 문제를 깊이 있게 이해하여 푸는 것이 중요한 것 같습니다.

 

풀이 접근 보여드리겠습니다.






빨강 강조 부분을 보면 확실하게 문제를 잘못 이해 한것을 볼수 있습니다.

 

아래 풀이가 올바른 접근 법이였습니다.




이렇게 접근하면 더 쉬운 풀이가 보입니다.

 

아래는 제가 풀어본 코드이며 다 오답이고 가장 아래 풀이가 정답입니다

 

 

package Question;

import java.io.*;

import java.util.Scanner;

// 백준 토너먼트

// https://www.acmicpc.net/problem/1057

public class Tournament {

    public static void main(String[] args) throws IOException {

        System.out.println(solution(16,1,2));

        System.out.println(solution(16,8,9));

        System.out.println(solution(1000,20,31));

        System.out.println(solution(65536,1000,35000));

        System.out.println(solution(60000,101,891));

        System.out.println(solution(7801,200,711));

        solutionBack();

        solution();

    }

    // 부르트 포스 접근법

    /**

     * IDEA

     * 1. n 반으로 나눈다.

     * 2. a b n 비교한다. (나눈 나온 결과 x , 1 부터 n 이면 a x 같은지 까지 비교, b x 초과 부터 n 마지막)

     * 3. 만약 a b같은 범위라면 1번부터 다시 시작

     * 4. 만약 둘의 범위 반으로 나뉘었을때 다르다면 나누고 나온 최대값의 2 n승값이 결과임

     *

     * 2 제곱근 n 구한다고 생각하면 만약

     * 2 제곱근의 값이 아니라면 2 나눈후 남은 값을 빼고 진행하면

     *

     * */

    public static int solution(int n, int a, int b) {

        int answer = -1;

        int exponent = -1;

        while (true){

            n = Math.round((float) n /2);

            //System.out.println(n + " t");

            // 범위 체크

            // 걸리면 n 구하기

            if(b <= n && n <= a){

                exponent = (int) Math.ceil((Math.log(n*2) / Math.log(2)));

                break;

            } else if ( a <= n && n <= b) {

                exponent = (int) Math.ceil((Math.log(n*2) / Math.log(2)));

                break;

            } else if (a >= n && b >= n) {

                exponent = (int) Math.ceil((Math.log(n) / Math.log(2)));

                break;

            }

            if(n == 1) break;

        }

        answer = exponent;

        return answer;

    }

    // 백준 입력 방식

    public static void solutionBack() throws IOException {

        int answer = -1;

        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();

        int a = sc.nextInt();

        int b = sc.nextInt();

        //System.out.println((Math.log(468) / Math.log(2)) + "dd");

        int exponent = -1;

        while (true){

            n = Math.round((float) n /2);

            //System.out.println(n + " t");

            // 범위 체크

            // 걸리면 n 구하기

            if(b <= n && n <= a){

                exponent = (int) Math.ceil((Math.log(n*2) / Math.log(2)));

                break;

            } else if ( a <= n && n <= b) {

                exponent = (int) Math.ceil((Math.log(n*2) / Math.log(2)));

                break;

            } else if (a >= n && b >= n) {

                exponent = (int) Math.ceil((Math.log(n) / Math.log(2)));

                break;

            }

            if(n == 1) break;

        }

        answer = exponent;

        System.out.println(answer);

    }

    // 해설지의 도움을 받음

    // 문제의 이해력 부족...

    // 시간을 들였으면 풀었을 같으나 많은 시간이 걸렸을 같음

    public static void solution(){

        Scanner sc = new Scanner(System.in);

        int n=sc.nextInt();

        int zimin =sc.nextInt();

        int hansu =sc.nextInt();

        int count = 0;

        while(zimin != hansu) {

            zimin = zimin/2 + zimin%2;

            hansu = hansu/2 + hansu%2;

            count++;

        }

        System.out.println(count);

    }

}