하루에 한 문제

[프로그래머스-lv2 2017 팁스타운] 예상 대진표 -Java 본문

알고리즘/프로그래머스 lv2 다시풀기

[프로그래머스-lv2 2017 팁스타운] 예상 대진표 -Java

dkwjdi 2021. 3. 14. 22:46

https://programmers.co.kr/learn/courses/30/lessons/12985

 

코딩테스트 연습 - 예상 대진표

△△ 게임대회가 개최되었습니다. 이 대회는 N명이 참가하고, 토너먼트 형식으로 진행됩니다. N명의 참가자는 각각 1부터 N번을 차례대로 배정받습니다. 그리고, 1번↔2번, 3번↔4번, ... , N-1번↔N

programmers.co.kr

class Solution {
		public int solution(int n, int a, int b) {
			int answer = 0;
			
			while(true) {
				answer++;
				if(check(a,b)) return answer;
				a=(a+1)/2;
				b=(b+1)/2;
			}
		}

		private boolean check(int a, int b) {
			if(a%2==0) { //a가 짝수이면 b는 a-1이어야 함
				if(b==a-1) return true;
			}
			else { //a가 홀수이면 b는 a+1
				if(b==a+1) return true;
			}
			return false;
		}
	}

소요시간 : 11분

로직을 살펴보면 위의 그림처럼

 

1-2의 승리자는 1번

3-4의 승리자는 2번

5-6의 승리자는 3번

7-8의 승리자는 4번이 됩니다.

 

즉 (n+1)/2 한 값이 자신이 승리했을 때 받게되는 다음 번호입니다.

그렇다면 a와 b가 대결하려면 서로의 번호가 어떻게 되야 할까요

 

만약 a가 3번이라면 b는 4번이어야 하고

만약 a가 4번이라면 b는 3번이여야 합니다.

 

즉, a가 홀수라면 b는 a+1이고

    a가 짝수라면 b는 a-1이 되면 됩니다.

 

끝~

Comments