본 글은 글쓴이의 개인적인 생각이 담겨있을 수 있습니다.
프로그래머스 [Programmers]
LEVEL - 2
예상 대진표
https://programmers.co.kr/learn/courses/30/lessons/12985
n명이 참가하는 대회가 존재한다.
이 대회에서는 1번과 2번, 3번과 4번, ... , n-1번과 n번이 겨뤄서 승자를 뽑는다.
승자들은 다음 라운드에 1번부터 n/2번을 차례대로 부여받습니다.
대회에 참가한 a와, b의 처음 부여받은 번호와 n이 주어질 때,
a와 b가 붙게 되는 라운드를 구하라.
class Solution
{
public int solution(int n, int a, int b)
{
int count = 1;
while(true) {
if((a % 2 != 0 && a + 1 == b) || (b % 2 != 0 && b + 1 == a))
return count;
a = (a + 1) / 2;
b = (b + 1) / 2;
count++;
}
}
}
처음에는 a가 b보다 번호가 작다는 것을 전제조건으로 하기 위해
swap() 함수를 만들어서 사용했었다.
하지만 a가 작든 b가 작든 while문 안의 if문의 조건을 조절하기만 하면 된다는 사실을 알게 되어,
if문의 조건을 좀 늘리는 방식을 채택했다.
처음에는 swap() 함수를 만들어서 사용한 것처럼 불필요한 코드를 삽입했었는데
문제 해결에 성공하고 나서 리팩토링을 하다보니 불필요한 코드가 있다는 것을 알 수 있었다.
이런식으로 단순히 알고리즘 문제를 풀 때에도 리팩토링을 해야 한다는 것을 겸비해두고 있으면
나중에 이 문제를 다시 풀다가 막혀도 쉽게 내 코드를 알 수 있는 방안이 될 것 같다.