문제
https://programmers.co.kr/learn/courses/30/lessons/12985
코딩테스트 연습 - 예상 대진표
△△ 게임대회가 개최되었습니다. 이 대회는 N명이 참가하고, 토너먼트 형식으로 진행됩니다. N명의 참가자는 각각 1부터 N번을 차례대로 배정받습니다. 그리고, 1번↔2번, 3번↔4번, ... , N-1번↔N
programmers.co.kr
풀이코드
public int solution(int n, int a, int b) { //예상대진표
int answer = 0; // 라운드 수
boolean loop = true; // 반복문을 컨트롤할 변수 생성
while (loop) {
answer++; // 반복문이 진행되면 라운드 수를 증가시킴
if (a % 2 == 0) { // a가 짝수일때, 그 다음 라운드로 올라갈 시, 가지는 숫자
a = a / 2;
} else if (a % 2 == 1) { // a가 홀수일때, 가지는 숫자
a = a / 2 + 1;
}
if (b % 2 == 0) { // b가 짝수일때, 가지는 숫자
b = b / 2;
} else if (b % 2 == 1) { // b가 홀수일때, 가지는 숫자
b = b / 2 + 1;
}
if(a == b){ // 만약에 a와 b가 같으면 같은 라운드에서 붙은 것이므로 반복문 종료
loop = false;
}
}
return answer;
}
이 문제는 생각보다 간단하다 예를 들어, 1번과 2번이 붙어서 어느쪽이 이겨도 다음 라운드에 올라가면 1번이 된다.
5번과 6번일 경우는 3번이 된다. 즉 홀수일때는 /2를 한뒤, +1을 하면 되었고 짝수일때는 /2를 하면 다음 라운드의 숫자가 되었다. 그리고 다음 라운드의 숫자가 같다는 것은 그 전 라운드에서 만났다는 것이므로 그때 반복문을 종료하면 된다.
원래는 이렇게 풀었으나 생각해보면 홀수, 짝수 나눌 것 없이
a = a / 2 + a % 2;
b = b / 2 + b % 2;
그냥 이렇게 적어버리면 홀수, 짝수를 나눌 것 없이 한번에 풀 수 있어서 이것을 적용하면
public int solution(int n, int a, int b) { //예상대진표
int answer = 0; // 라운드 수
boolean loop = true; // 반복문을 컨트롤할 변수 생성
while (loop) {
answer++; // 반복문이 진행되면 라운드 수를 증가시킴
a = a / 2 + a % 2; // a에 다음 라운드 때 받을 숫자를 넣음
b = b / 2 + b % 2; // b에 다음 라운드 때 받을 숫자를 넣음
if(a == b){ // 만약에 a와 b가 같으면 같은 라운드에서 붙은 것이므로 반복문 종료
loop = false;
}
}
이렇게 비교적 간단하게 나타낼 수 있게 된다.
'프로그래머스 > Level 2' 카테고리의 다른 글
| [프로그래머스][Level2][Java] 멀리 뛰기 (0) | 2022.06.14 |
|---|---|
| [프로그래머스][Level2][Java] 구명보트 (0) | 2022.06.11 |
| [프로그래머스][Level2][Java] 전화번호 목록 (0) | 2022.06.11 |
| [프로그래머스][Level2][Java] 2xn 타일링 (0) | 2022.06.04 |
| [프로그래머스][Level2][Java] 모음사전 (0) | 2022.05.22 |