프로그래머스(Java) - 예상 대진표

민지킴·2021년 5월 3일
0

프로그래머스

목록 보기
23/42
post-thumbnail

문제 링크

https://programmers.co.kr/learn/courses/30/lessons/12985#

문제 풀이

코드를 조금 복잡하게 짜게 됬다.
이분 탐색인줄 알았지만 그건 아니었던 걸로...

nowline은 현재 대진표에 남아있는 사람의 절반을 나타내는 값이다.
그래서 nowline을 기준으로 a,b의 위치가 좌우에 있다면 반드시 현재 nowline의 지수의 값 +1 만큼의 round를 진행하게 된다.

if(nowline>=a && nowline<b){
                //딱 중간
                answer = jisu+1;
                break;
            }

nowline보다 a,b가 둘다 작다면 nowline 이후의 값들은 필요가 없으니 버려준다.

else if(nowline>=a && nowline>=b){
                nowline = nowline/2;
                jisu--;
             }

nowline보다 a,b가 둘다 크다면 nowline 이전의 값들은 필요가 없으니 버리는데
이경우 앞에 있는 자리로 떙겨줘야 하므로 a,b를 nowline만큼 뺴준다.

else { //nowline <=a && nowline<=b
                a -= nowline;
                b -= nowline;
                nowline = nowline/2;
                jisu--;
            }

코드

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

        int nowline = n/2;
        int jisu = -1;
        while(n!=1){
            n = n/2;
            jisu++;
        }
       
        //System.out.println(jisu);
        //a<b로 만들어줌
        if(a>b){
            int temp = a;
            a = b; 
            b= temp;
        }
        //System.out.println(nowline+" "+jisu);
        while(true){
            if(nowline>=a && nowline<b){
                //딱 중간
                answer = jisu+1;
                break;
            }else if(nowline>=a && nowline>=b){
                nowline = nowline/2;
                jisu--;
             }else { //nowline <=a && nowline<=b
                a -= nowline;
                b -= nowline;
                nowline = nowline/2;
                jisu--;
            }
                       
         }
        
        
        return answer;
    }
}
profile
하루하루는 성실하게 인생 전체는 되는대로

0개의 댓글