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


2의 지수를 이용하여 푸는 문제

정답제출코드


#include <iostream>

using namespace std;

int solution(int n, int a, int b)
{
    int answer = 1;
    
    while (!((a-b == 1 && a%2== 0) || (b-a == 1 && b%2 == 0)))
    {
        answer++;
        
        if (a % 2 == 1)
            a += 1;
        if (b % 2 == 1)
            b += 1;

        if (a > 1)
            a /= 2;
        if (b > 1)
            b /= 2;
    }

    return answer;
}

대진표를 예상해보자.

7번 선수에서 시작했다고 가정하면 7 - 4 - 2 순서대로 흘러갈 것이고,

3번 선수에서 시작했다고 가정하면 3 - 1,

14번에서 시작했다고 가정하면 14 - 7 - 4 - 2 - 1로 흘러갈 것이다.

그래서 홀수면 1을 더해주고 짝수면 그냥 2를 나눠버리는 방법을 택했다.

그리고 중지 조건은 while문 조건에 있는 대로 a와 b의 차이가 1이면서 a가 b보다 더 큰 짝수일 때

혹은 a와 b의 차이가 1이면서 b가 a보다 더 큰 짝수일 때 중지하도록 구현하였다.

예외 처리 사항을 보자.

  • 차이가 1일 경우만 생각하면 만약에 a = 6, b = 7인 경우가 발생해버리면 오답이 출력될 수 있다.

그래서 조건문을 저렇게 만들었다.


© 2022.07. by Wookey_Kim

Powered by Hydejack v7.5.2