Programmers/Level 2

C++ / 프로그래머스 / 예상 대진표

GitHubSeob 2022. 4. 20. 21:24
문제

 

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

 

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

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

programmers.co.kr

문제풀이

 

A가 B보다 항상 작다는 조건이 없어서 A가 B보다 클 경우 swap을 했다.

대진표에서 A가 번호가 작으므로 B와 붙을 경우 왼쪽에 A 오른쪽에 B가 된다.

따라서 만나는 경우에는 A를 2로 나눈 나머지가 1, A+1은 B인 경우밖에 없다.

 

a, b가 홀수인 경우에는 +1을 하고 2로 나누고, 그 외에는 그냥 2로 나눈다.

1,2가 붙고 3, 4가 붙는데 1/2와 2/2는 몫이 다르기 때문에 홀수의 경우는 +1을 해야 한다.

코드
#include <algorithm>
using namespace std;

int solution(int n, int a, int b)
{
    int idx(1);

    if (a > b) {
        swap(a, b);
    }

    while (1) {
        if (a % 2 == 1 && a + 1 == b) {
            return idx;
        }
        if (a % 2 == 1) {
            a++;
        }
        if (b % 2 == 1) {
            b++;
        }
        a /= 2;
        b /= 2;
        ++idx;
    }
}