문제
문제 설명
△△ 게임대회가 개최되었습니다. 이 대회는 N명이 참가하고, 토너먼트 형식으로 진행됩니다. N명의 참가자는 각각 1부터 N번을 차례대로 배정받습니다. 그리고, 1번↔2번, 3번↔4번,... , N-1번↔N번의 참가자끼리 게임을 진행합니다. 각 게임에서 이긴 사람은 다음 라운드에 진출할 수 있습니다. 이때, 다음 라운드에 진출할 참가자의 번호는 다시 1번부터 N/2번을 차례대로 배정받습니다. 만약 1번↔2번 끼리 겨루는 게임에서 2번이 승리했다면 다음 라운드에서 1번을 부여받고, 3번↔4번에서 겨루는 게임에서 3번이 승리했다면 다음 라운드에서 2번을 부여받게 됩니다. 게임은 최종 한 명이 남을 때까지 진행됩니다.
이때, 처음 라운드에서 A번을 가진 참가자는 경쟁자로 생각하는 B번 참가자와 몇 번째 라운드에서 만나는지 궁금해졌습니다. 게임 참가자 수 N, 참가자 번호 A, 경쟁자 번호 B가 함수 solution의 매개변수로 주어질 때, 처음 라운드에서 A번을 가진 참가자는 경쟁자로 생각하는 B번 참가자와 몇 번째 라운드에서 만나는지 return 하는 solution 함수를 완성해 주세요. 단, A번 참가자와 B번 참가자는 서로 붙게 되기 전까지 항상 이긴다고 가정합니다.
제한사항- N : 21 이상 220 이하인 자연수 (2의 지수 승으로 주어지므로 부전승은 발생하지 않습니다.)
- A, B : N 이하인 자연수 (단, A ≠ B 입니다.)
입력 & 출력
입출력 예
NABanswer
8 | 4 | 7 | 3 |
풀이 과정
Lv2 문제이지만 쉬운 문제였습니다.
1. 컨셉은 대진표로 잡았지만 문자 두 개가 서로 붙게 되는 경우만 생각하면 되겠습니다. 그 경우는 나눴을 때의 나머지와 상관없이 나눈 값이 같아지는 경우입니다. 이는 a or b //2로 생각해볼 수 있겠습니다.
2. 1번과 같이 계산한값이 서로 같은지 if문으로 판별합니다 if a//2 == b//2
3. 여기서 처음부터 같은 값이면 좋겠지만 그렇지 않을 경우가 더 많기 때문에 a와 b값의 변화가 필요합니다 a b는 홀수일 경우에는 2로 나눠서 1을 더 한 값이 되며 짝수일 경우에는 2로 나눈 값이 되게 됩니다. 이것 또한 (a//2) + (a%2)로 나타낼 수 있습니다 2번의 조건문과 방금 전의 문자열 변환하는 값을 같이 수행하게 하고 한번 수행할 때마다 cnt의 값을 1씩 증가시키면 원하는 값을 구할 수 있습니다.
코드
def solution(n, a, b):
cnt = 0
while True:
a = (a // 2) + (a % 2)
b = (b // 2) + (b % 2)
cnt += 1
if a == b:
break
return cnt
'Algorithm' 카테고리의 다른 글
[프로그래머스] 코딩테스트 연습Summer/Winter Coding(~2018) 소수 만들기 (0) | 2022.08.06 |
---|---|
8-5[코딩테스트] 알고리즘 연습 (0) | 2022.08.05 |
[프로그래머스]코딩테스트 연습완전탐색 소수 찾기 (0) | 2022.08.05 |
[프로그래머스] 코딩테스트 연습 Greedy algorithm 체육복 (0) | 2022.08.03 |
[프로그래머스] 코딩테스트 연습정렬 K번째수 (0) | 2022.08.02 |