[코딩테스트] 프로그래머스 12985, 예상 대진표

2022. 5. 13. 15:20CodingTest

문제

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

 

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

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

programmers.co.kr

 

접근

1. 입력 a와 b가 서로 같은 그룹에 있는지 확인

	public boolean isFight(int a, int b) {
		return (a + 1) / 2 == (b + 1) / 2 ? true : false;
	}

2. 같은 그룹에 있지 않다면 절반씩 나누어 다시 저장

a = (a+1)/2;
b = (b+1)/2;

3. 1번 과정이 참일때까지 반복

 

코드

public class Solution {
	public boolean isFight(int a, int b) {
		return (a + 1) / 2 == (b + 1) / 2 ? true : false;
	}
	
    public int solution(int n, int a, int b)
    {
        int answer = 1;
        
        while(true) {
        	if(isFight(a, b)) {
        		break;
        	}
        	a = (a+1)/2;
        	b = (b+1)/2;
        	answer++;
        }
        
        return answer;
    }    
}
class SolutionTest {

	@Test
	void test1() {
		Assert.assertEquals(3, new Solution().solution(8, 4, 7));
	}
	
	@Test
	void test2() {
		Assert.assertEquals(3, new Solution().solution(8, 1, 5));
	}
	
	@Test
	void test3() {
		Assert.assertEquals(3, new Solution().solution(8, 2, 8));
	}
	
	@Test
	void test4() {
		Assert.assertEquals(2, new Solution().solution(8, 2, 3));
	}

}