출처: 프로그래머스 코딩테스트 연습
https://school.programmers.co.kr/learn/courses/30/lessons/12985
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제
풀이
입출력 예를 살펴보면 N=8이기 때문에 1, 2, 3, 4, 5, 6, 7, 8 번의 참가자가 게임을 진행한다.
토너먼트 형식이기 때문에 1번 - 2번 / 3번 - 4번 / 5번 - 6번 / 7번 - 8번 끼리 진행된다.
1라운드가 끝나면 번호는 다시 1부터 배정이 되기 때문에 1, 2, 3, 4번으로 배정이 될 것이다.
이때 규칙을 찾을 수 있는데, 현재 번호에 1을 더하고 2로 나눈 몫이 다음 라운드에 배정 받을 번호가 된다는 것이다.
다음 라운드 배정 번호 | 1번 | 2번 | 3번 | 4번 |
현재 라운드 번호 | 1번 : (1 + 1) / 2 = 1번 2번 : (2 + 1) / 2 = 1번 |
3번 : (3 + 1) / 2 = 2번 4번 : (4 + 1) / 2 = 2번 |
5번 : (5 + 1) / 2 = 3번 6번 : (6 + 1) / 2 = 3번 |
7번 : (7 + 1) / 2 = 4번 8번 : (8 + 1) / 2 = 4번 |
위 표처럼 1, 2번의 경우 다음 라운드에서는 1번을, 3, 4번의 경우 2번을 배정받게 될 것이다.
4번과 7번은 서로 붙게 될 때까지 항상 이기기 때문에 항상 번호를 배정 받게 될 것이다.
따라서 4번과 7번이 서로 붙을 때까지 == 4번과 7번이 다음 라운드에 배정 받게 될 번호가 같아질 때까지, 다음 라운드에 배정 받게 될 번호를 반복적으로 구하고 라운드 횟수를 카운트 해준다.
말로 하려니 복잡하지만 코드를 보면 훨씬 이해가 쉬울 것이다!
소스코드
import java.util.*;
class Solution
{
public int solution(int n, int a, int b)
{
int answer = 0; // 라운드 횟수
// 반복문 한 번이 라운드 한 번
// a와 b가 같아지면 즉, a와 b가 붙게 되면 반복문 중단
while(a != b){
// a와 b의 다음 라운드에 배정 받게 될 번호를 구한다
a = (a + 1) / 2;
b = (b + 1) / 2;
answer ++;
}
return answer;
}
}
'Programming > Programmers' 카테고리의 다른 글
[프로그래머스] 12980번 - 점프와 순간 이동 (Java) (0) | 2023.06.13 |
---|---|
[프로그래머스] 43164번 - 여행경로 (Java) (0) | 2023.06.12 |
[프로그래머스] 43162번 - 네트워크 (JAVA) (0) | 2023.06.11 |
[프로그래머스] 12973번 - 짝지어 제거하기 (JAVA) (0) | 2023.06.08 |
[프로그래머스] 12945번 - 피보나치 수 (JAVA) (0) | 2023.06.07 |