본문 바로가기

컴퓨터 프로그래밍/알고리즘

프로그래머스-예상 대진표

https://programmers.co.kr/learn/courses/30/lessons/12985?language=java

 

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

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

programmers.co.kr

<내 풀이>

라운드가 하나씩 올라갈때마다 n도 1/2씩 줄어듭니다. 그래서 n=2일때 까지 반복해서 연산을 합니다. 처음에 a,b 중 어떤 수가 작은 수인지 모르기 때문에 일단, 그 처리를 먼저 해줍니다. 그런다음에 시합을 하기 위해서는 작은 수가 홀수이고, 그 수에 1을 더한 값이 b여야합니다. 그래서 이조건을 만족시키는 answer를 return합니다. 이 조건을 만족시키지 못하면 2로 나누어진 수를 올림해서 구해줍니다. 

package algorithm_2;

public class l12 {
	public static int solution(int n, int a, int b)
    {
        int answer = 1;
        int temp =0;
        if(a>b) {
        	temp=a;
        	a=b;
        	b=temp;
        }
        while(n!=1) {
        	if((a%2!=0)&&(a+1==b)) {
        		return answer;
        	}else {
        		a=(int) Math.ceil((double)a/2);
        		b=(int) Math.ceil((double)b/2);
        		n/=2;
        		answer++;
        	}
        }
        
        
        
        // [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
        System.out.println("Hello Java");

        return answer;
    }

	public static void main(String[] args) {
		int n = 8;
		int a = 4;
		int b = 7;
		
		System.out.println(solution(n, a, b));
	}

}

<남풀이>

나는 반복횟수를 n을 활용해서 했는데, 아얘  a=b가 같아 지기 전까지 연산을 하는 것으로 반복문을 짰다. 좋은 생각 인 것 같습니다. 

class Solution
{
    public int solution(int n, int a, int b)
    {
        int round = 0;
        while(a != b)
        {
            a = a/2 + a%2;
            b = b/2 + b%2;
            round++;
        }
        return round;
    }
}