코딩테스트/Programmers

[JAVA] 예상 대진표

hxx_1 2024. 4. 25. 16:38

< 내 풀이 >

class Solution
{
    public int solution(int n, int a, int b)
    {
        int answer = 0;
        double num1=(double)a;
        double num2=(double)b;
        
        while(a!=b){
            num1=Math.ceil(num1/2);
            num2=Math.ceil(num2/2);
            
            a=(int)num1;
            b=(int)num2;
            answer++;
        }

        return answer;
    }
}

✏️ 풀이 방법

 

a 와 b 가 같아질 때까지 반복문을 돈다.

=> Math.ceil(a/2) , Math.ceil(b/2) 를 반복한다.

    : ⚠️ Math.ceil을 사용해서 원하는 값을 나오게 하기 위해서는 a와 b가 int형이 아닌 실수형이어야한다. 

=> 같아질 때까지 이를 반복하는 횟수가 라운드 횟수이다. 

 

< 다른 사람의 풀이 >

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;
    }
}

 

✍🏻 느낀점

 

 처음에 헷갈렸던 부분은 뭔가 n을 쓸 일이 없는 것 같은데, n을 어디에 써야하지? 였다. 그리고 첫 풀이에서 나는 반복문이 돌아가는 조건을 while(Math.abs(a-b!=1))  이런식으로 하고, 올림 함수가 아닌 반올림 함수를 사용해서 이상한 값이 나왔다. 나는 올림 함수를 써서 문제를 해결했는데, 위 풀이 방법으로 하는 것이 더 간단한 것 같다.  나머지는 나누는 수보다 항상 작으니  2로 나눈 나머지는 항상 0 또는 1이 나올것이고, 이것을 몫에 더해주면 결국 올림 함수를 사용해서 푼 내 방식과 똑같다. 이번에도 또 하나 배웠다 !