study/Coding Test
[Python] 프로그래머스 Lv 2. 예상 대진표
희김
2023. 5. 11. 15:59
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제
- 2의 거듭제곱 수 만큼의 참가 인원이 주어지고 참가자는 각자의 번호를 가진다.
- 하나의 라운드를 거칠 때마다 참가자의 번호가 달라진다.
- 1,2번 참가자가 경기를 하여 이긴 사람이 1번이 되고, 3,4번 중 이긴 사람이 2번이 되는 것이다.
- 임의의 두 참가자의 시작 번호가 주어질 때 두 사람이 만나게 되는 라운드를 구하면 된다.
나의 생각
- 대진표의 모양 때문인지 비교적 최근에 배운 이진트리가 먼저 생각이 났다. 루트 노드의 간격에 따라서 정답이 정해지기 때문에 무언가 그럴싸 했다. 하지만 부족했던 건 나의 능력. 상황에 맞게 응용해서 구현하지 못했다.
- 다음으로 한 것은 인원을 8명으로 두고 상황을 생각해보았다. 현재 번호와 다음 라운드의 숫자를 써놓고 보니 패턴이 보였다.
1 2 3 ···
1 2 3 4 5 6 ···
- 위와 같은 형태를 보았을 때 이전 라운드에서의 숫자를 2로 나누는 것과 관련이 있는게 분명했다.
1. 숫자를 2로 나눈 몫 + 2로 나눈 나머지
2. 1을 더해 2로 나눈 몫
- 위 두가지가 눈에 들어왔고 바로 실행에 옮겨보았다.
def solution(n,a,b):
cnt = 0
while a!=b:
#2로 나눈 나머지 + 몫 -> 다음 라운드의 숫자가 된다.
a = (a//2) + (a%2)
b = (b//2) + (b%2)
cnt+=1
return cnt
def solution(n,a,b):
cnt = 0
while a!=b:
a = (a+1//2)
b = (b+1//2)
cnt+=1
return cnt
두 가지 방법 모두 잘 실행되었다!
수학적 식을 사용하는 경우가 꽤 많은 것 같다고 느꼈다. 항상 다른 시각에서도 바라볼 수 있는 능력이 중요하겠다.