문제 설명
N명이 참가한 대회는 토너먼트 형식으로 진행됩니다. N명의 참가자는 각각 1부터 N번을 차례대로 배정받습니다.
그리고 1vs2, 3vs4, ..., N-1 vs N 의 참가자가 게임을 진행하고, 각 게임에서 이긴 사람은 다음 라운드에서도 같은 방식으로 경기를 진행합니다.
게임 참가자 수 N, 참가자 번호 A, 참가자 번호 B가 함수 solution에 매개변수로 주어질 때,
처음 라운드에서 A번을 가진 참가자는 B번 참가자와 몇 번째 라운드에서 만나는지 return 하는 solution 함수를 완성하세요

풀이 과정
- 매개변수 a와 b를 무조건 a<b로 만들어 줍니다. (나중에 연산자 사용을 줄이기 위해)
- 경기하는 사람을 모두 LinkedList에 넣고 while문으로 경기를 진행합니다.
- 라운드 당 경기수는 (남아있는 사람 수/2)로 for문을 사용해 경기를 진행합니다.
- 경기에서 a와 b가 출전하게 되는 경우에는 무조건 그 선수가 이기도록 하고,
a,b가 아닌 선수는 뒤의 선수가 이기게 하여 다음 라운드에 넣습니다. - a와 b가 대결할 때까지 3-4번 과정을 반복합니다.
- 경기를 진행하다가, 붙는 두 사람이 a와 b이면 반복문을 종료하고 answer(라운드 수)를 반환합니다.
전체 코드
import java.util.LinkedList;
class Solution
{
public int solution(int n, int a, int b)
{
int answer = 0;
//무조건 a<b로 만든다.
if(a>b){
int temp=a;
a=b;
b=temp;
}
//경기하는 사람들 모두 LinkedList에 넣음.
LinkedList<Integer> q = new LinkedList<>();
for(int i=1;i<=n;i++)
q.add(i);
int vs1,vs2;
vs1=vs2=-1;//초기화.
while(!q.isEmpty()){
answer++; //한 사람의 대결 수
//해당 경기는 q에 남아있는 사람 수/2만큼 한다.
int times=q.size()/2;
for(int i=0;i<times;i++){
vs1=q.poll();
vs2=q.poll();
if(vs1==a && vs2==b){ //a,b가 붙게 되면 종료
break;
}
//첫번째 대결자가 a,b이면 첫번째 대결자가 무조건 이긴다.
if(vs1==a || vs1==b)
q.add(vs1);
//그렇지 않으면 두번째 대결자가 이긴 것으로 처리함.
else
q.add(vs2);
}
if(vs1==a && vs2==b){ //a,b가 붙게 되면 대결 종료.
break;
}
}
return answer;
}
}'Algorithms(CT)' 카테고리의 다른 글
| [프로그래머스][Java] Lv.3 아이템 줍기 (0) | 2023.06.14 |
|---|---|
| [프로그래머스][Java] Lv.2 점프와 순간이동 (0) | 2023.06.13 |
| [프로그래머스][Java] Lv.3 여행경로 (0) | 2023.06.12 |
| [프로그래머스][Java] Lv.3 단어 변환 (0) | 2023.06.11 |
| [프로그래머스][Java] Lv.2 영어 끝말잇기 (0) | 2023.06.10 |