아직 까지는 레벨 2중에 쉬운 문제가 아닐까?

 

하는 생각이 들지만, 놀랍게도 결국 혼자 풀기엔 어려움이 있던 문제였다.

 

 

문제를 간단히 해석해 보면, 

N 명으로 시작하여, 

라운드 (answer) 가 지날때 마다 인원수는 절반이 될것이다. 

만약, A 와 B가 첫 번째 라운드에서 붙는다면, answer = 1 이 될것이기 때문에

N/1 = 1 이 될 것이고,

 

이후에 진행될 대전 상황은,

 

N/2 = 2

N/4 = 3

N/8 = 4 ... 이런 느낌이 될 것이다 .   

 

N/8 은 N/N 이므로, 1명만 남게 된 상황이고 우승까지 필요한 라운드가 answer= 4 가 될 것이다..

 

 

정리해보면,

 

N 부터 시작해서 answer =1

다음 라운드 = N/2^1  , answer ++  와 같이 진행될 것이고,

A 와 B 는 반드시 이긴다고 가정하고, N 은 항상 2의 배수 이며, 

A 와 B가 짝수라고 가정하면 A와 B를 2로 나눌때 마다 라운드가 1회 진행된다고 볼 수 있다.

 

 

그렇게 했을 때, a와 b의 차이가 1이 나게 된다면, a 와 b가 붙는 상황이므로

위처럼 구면되지 않을까 ?

 

하지만 실패와 시간 초과가 무수히 발생

 

이유는, 짝수로 만들고 시작한다고 해도, 한 쪽이 1이 되어버린 이후

계속해서 while문이 반복된다면 0.5... 0.25 .. 계속 소수로 작아질 것이기 때문에

무한 루프가 완성된다.

 

 

코드를 위와 같이 개선하여, 굳이 짝수로 맞춰주지 않고

Mah.ceil 을 통해 결과값이 홀수면 올림처리를 하여 반드시 짝수가 되도록 했다.

A 나 B가 이미 짝수라면 변화가 없고, 홀수라면 결과값이 1 증가하여 짝수가 되기 때문에 

코드가 간단해졌고, 결과값이 1 / 2 = 0.5 가 된 경우도 올림처리를 하여 1이 되기 때문에 무한루프 문제도 해결됐다.

하지만 또 에러 발생

위 처럼 초기에 1차이가 나는 상태로 시작할 경우, 

반복문이 실행되지 않고 그대로 answer =1 을 반환해버린다.

 

아무래도 조건을 다르게 설정해야 할 듯 하다.

 

 

위처럼  answer = 0으로 시작하여, 

a 와 b 가 같지 않을경우 반복문이 실행되게 한다면

위에서 나타난 문제점을 전부 해결할 수 있다.

 

 

조건에 A !== B 를 명시했기 때문에 a=b 로 시작해 0이 반환될 일도 없다.

 

 

+ Recent posts