[Programmers] 예상 대진표
본 글은 글쓴이의 개인적인 생각이 담겨있을 수 있습니다.
프로그래머스 [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가 붙게 되는 라운드를 구하라.
주의사항
- n은 2^(1 ~ 20) 이하인 자연수이다.
- a와 b는 n 이하의 자연수이다.
- a != b 이다.
- 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++;
}
}
}
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() 함수를 만들어서 사용한 것처럼 불필요한 코드를 삽입했었는데
문제 해결에 성공하고 나서 리팩토링을 하다보니 불필요한 코드가 있다는 것을 알 수 있었다.
이런식으로 단순히 알고리즘 문제를 풀 때에도 리팩토링을 해야 한다는 것을 겸비해두고 있으면
나중에 이 문제를 다시 풀다가 막혀도 쉽게 내 코드를 알 수 있는 방안이 될 것 같다.
Author And Source
이 문제에 관하여([Programmers] 예상 대진표), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@dhwlddjgmanf/Programmers-예상-대진표저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)