본문 바로가기
C++ 코딩 문제 풀이/프로그래머스

[Programmers] 예상 대진표

by 섬댕이 2023. 8. 28.

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 


 

문제 해결 과정

착안

아래와 같은 규칙을 반복적으로 적용하여 대진 라운드를 계산할 수 있다. $N$ 명의 참가자에 대하여, 번호 순으로 $N / 2$ 명씩 그룹을 지었을 때,

 

  • A와 B가 서로 다른 그룹에 있는 경우: A와 B가 각각 반드시 승리해서 다음 라운드로 진출해야하므로, A의 번호 및 B의 번호에 1을 더한 뒤 2로 나눈 값으로 갱신하고, 라운드 수를 증가시킨다.
  • A와 B가 서로 같은 그룹에 있는 경우: 그룹 내에서 대진을 살펴봐야하므로, 참가자를 $N / 2$ 명으로 줄여 생각할 수 있고 이때 A 또는 B의 번호가 $N / 2$보다 큰 경우는 각각 $N / 2$ 만큼 빼서 번호만 갱신한다.

 

구현

[스포 주의] 아래 '더보기'를 누르면 코드가 나오니 주의하세요~

더보기
int solution(int n, int a, int b)
{
	int answer = 1;

	while (n > 2)
	{
		if (a + 1 == b && a % 2 ||
			b + 1 == a && b % 2)
			break;

		n /= 2;

		if (a <= n && b > n ||
			a > n && b <= n)
		{
			answer++;
			a = (a + 1) / 2;
			b = (b + 1) / 2;
		}
		else if (a > n)
		{
			a -= n;
			b -= n;
		}
	}

	return answer;
}

 

실행 결과

댓글