<Algorithm> 105. 1057번 토너먼트
by BFine반응형
1. 1057번 토너먼트
문제해결능력을 묻는 문제
처음에는 반씩 나누면 될 것 같아서 분할 정복으로 접근을 했는데 테스트 하던 도중에 다음라운드에서 짝수 홀수가 바뀐다는 것을 알고 잘못 접근했다는 사실을 깨달았다..
다른 블로그에서 번호 메기는 부분으로 접근하면 된다는 힌트를 얻어서 간단하게 풀 수 있었다.
무조건 알고리즘으로 접근 할께 아니라 규칙을 찾는 것도 중요한 것 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws NumberFormatException, IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); int n = Integer.parseInt(st.nextToken()); int a = Integer.parseInt(st.nextToken()); int b = Integer.parseInt(st.nextToken()); int temp = a; a = Math.min(a, b); b = Math.max(temp, b); /****************************** * 나누기 2 + 나머지 2의 식을 이용하면 * 다음번 번호부여를 알 수 있고 * 이 번호가 같을때까지 반복한다. *******************************/ int count = 0; while(a!=b) { a = a/2+a%2; b = b/2+b%2; count ++; } System.out.println(count); /*int start = 1; int end = n; int total = 0; if(n%2 != 0) total++; while(n > 1) { n = n/2; total++; } if(a==end || b==end) { System.out.println(total); return; } while(start <= end) { int m = (start+end)/2; if(a >= start && a <= m && b > m && b <= end) { break; }else { if(a >= start && a <= m && b >= start && b <= m) { end = m; }else { start = m+1; } } total--; } System.out.println(total); */ } } | cs |
참고 & 출처
반응형
'공부(2018~2019) - 스킨변경전 > Algorithm' 카테고리의 다른 글
<Algorithm> 107. 예산(프로그래머스) (1) | 2019.02.09 |
---|---|
<Algorithm> 106. 체육복(프로그래머스) (0) | 2019.02.07 |
<Algorithm> 104. 1389번 케빈 베이컨의 6단계법칙 (0) | 2019.02.05 |
<Algorithm> 103. 2583번 영역구하기 (0) | 2019.02.05 |
<Algorithm> 102. 모의고사(프로그래머스) (0) | 2019.02.04 |
블로그의 정보
57개월 BackEnd
BFine