예상 대진표

하이솝·2026년 3월 6일

1차 실행 오류
a, b의 차수가 같은 경우를 고려하지 않음.

class Solution
{
    public int solution(int n, int a, int b)
    {
        int answer = 0;
        int boundary = 2;
        int round = 1
        
        while(true) {
            if (boundary >= a && boundary >= b) {
                answer = round;
                return answer;
            }
            boundary *= 2;
            round++;
        }
    }
}

2차 실행 오류
차수가 0인 경우를 고려하지 않음.

class Solution
{
    public int solution(int n, int a, int b)
    {
        int answer = 0;
        
        int degreeA = 1;
        int degreeB = 1;
        
        int i = 2;
        // a가 속한 범위의 차수 구하기
        while(true) {
            if (i >= a) {
                break;
            }
            i *= 2;
            degreeA++;
        }
        // b가 속한 범위의 차수 구하기
        i = 2;
        while(true) {
            if (i >= b) {
                break;
            }
            i *= 2;
            degreeB++;
        }
        if (degreeA > degreeB) {
            answer = degreeA;
            return answer;
        }
        else if (degreeA < degreeB) {
            answer = degreeB;
            return answer;
        }
        else {
            n = (int)Math.pow(2, degreeA - 1);
            a %= (int)Math.pow(2, degreeA - 1);
            b %= (int)Math.pow(2, degreeB - 1);
            return solution(n, a, b);
        }
    }
}

3차 실행 오류
재귀 시 a 또는 b가 나누어 떨어져서 0이 나오는 경우의 수를 고려하지 않음.

class Solution
{
    public int solution(int n, int a, int b)
    {
        int answer = 0;
        
        int degreeA = 1;
        int degreeB = 1;
        
        int i = 2;
        // a가 속한 범위의 차수 구하기
        while(true) {
            if (a == 1) {
                degreeA = 0;
                break;
            }
            if (i >= a) {
                break;
            }
            i *= 2;
            degreeA++;
        }
        // b가 속한 범위의 차수 구하기
        i = 2;
        while(true) {
            if (b == 1) {
                degreeB = 0;
                break;
            }
            if (i >= b) {
                break;
            }
            i *= 2;
            degreeB++;
        }
        if (degreeA > degreeB) {
            answer = degreeA;
            return answer;
        }
        else if (degreeA < degreeB) {
            answer = degreeB;
            return answer;
        }
        else {
            n = (int)Math.pow(2, degreeA - 1);
            a %= (int)Math.pow(2, degreeA - 1);
            b %= (int)Math.pow(2, degreeB - 1);
            return solution(n, a, b);
        }
    }
}

주어진 문제에서 수학적인 규칙을 찾아내는 연습이 부족함.
여러 문제를 풀어보며 경험을 쌓을 것.

소요 시간: 1시간 11분 57초

class Solution
{
    public int solution(int n, int a, int b)
    {
        int answer = 0;

        int degreeA = 1;
        int degreeB = 1;

        int i = 2;
        // a가 속한 범위의 차수 구하기
        while(true) {
            if (a == 1) {
                degreeA = 0;
                break;
            }
            if (i >= a) {
                break;
            }
            i *= 2;
            degreeA++;
        }
        // b가 속한 범위의 차수 구하기
        i = 2;
        while(true) {
            if (b == 1) {
                degreeB = 0;
                break;
            }
            if (i >= b) {
                break;
            }
            i *= 2;
            degreeB++;
        }
        if (degreeA > degreeB) {
            answer = degreeA;
            return answer;
        }
        else if (degreeA < degreeB) {
            answer = degreeB;
            return answer;
        }
        else {
            n /= 2;
            a %= n;
            if (a == 0) {
                a = n;
            }
            b %= n;
            if (b == 0) {
                b = n;
            }
            return solution(n, a, b);
        }
    }
}

정답 코드 1

class Solution
{
    public int solution(int n, int a, int b)
    {
        return Integer.toBinaryString((a-1)^(b-1)).length();
    }
}

정답 코드 2

class Solution
{
    public int solution(int n, int a, int b)
    {
        int round = 0;
        while(a != b)
        {
            a = a/2 + a%2;
            b = b/2 + b%2;
            round++;
        }
        return round;
    }
}

0개의 댓글