아직 까지는 레벨 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이 반환될 일도 없다.
'알고리즘 풀이' 카테고리의 다른 글
Javascript - 멀리 뛰기 [Level: 2] (1) | 2024.11.13 |
---|---|
Javascript - 피보나치 수 [Level: 2] (0) | 2024.10.18 |
Javascript - 개인정보 수집 유효기간 [Level: 1] (0) | 2024.09.26 |
Javascript - 바탕화면 정리 [Level: 1] (0) | 2024.09.20 |
Javascript - 성격 유형 검사하기 [Level: 1] (0) | 2024.09.19 |