https://www.acmicpc.net/problem/12931
우선 처음으로 생각할 부분이, 만약 시작지점인 0,0,0,... 에서 시작해서 제시된 B 배열을 찾아가려면 결국 모든 경우를 봐야한다. 매번 B 배열과 비교하며 최소 연산 횟수를 찾게 짜는건 사실상 무리라고 본다. 그럼 반대로 B 배열에서 0,0,0,...을 찾아가는걸 생각해보자.
제시된 연산은 각각에대해 1을 더하는 것과 전체에 대해 2를 곱하는 것이므로, 반대로 B배열에서 0,0,0,... 을 찾아가기 위해서는 각 배열에 대해 1을 빼는 연산과, 전체에 대해 2로 나누는 과정을 거쳐야 한다. 그럼 N=1일 때 조차도 무조건 2로 나누는 것이 이득인 것을 쉽게 알 수 있다. (더 적은 연산으로 차이를 더 많이 낼 수 있음)
최종적으로 이 문제는 간단하게 B -> 0,0,0,... 을 만들면서 모두를 2로 나눌 수 있다면(전부 짝수거나 0이라면) 무조건 2로 나누고, 그게 아니라면 모두를 짝수 혹은 0으로 만드는 과정을 반복하면 된다. 즉 그리디 알고리즘 방식을 택하면 쉽게 풀 수 있다.
코드에서도 마찬가지로 모두 0이 되기 전까지(!isEnd()) 모두 짝수로 만드는 과정(makeAllEven())과 2로 나누는 과정(makeHalf())를 반복하며, 이 때의 횟수가 결국 최소 연산 횟수이다.
https://github.com/NaHwaSa/BOJ_BaekjunOnlineJudge/blob/master/12900/BOJ_12931.java
'PS > BOJ' 카테고리의 다른 글
백준 15993 자바 - 1, 2, 3 더하기 8 (BOJ 15993 JAVA) (0) | 2021.10.07 |
---|---|
백준 22866 자바 - 탑 보기 (BOJ 22866 JAVA) (0) | 2021.10.05 |
백준 15989 자바 - 1, 2, 3 더하기 4 (BOJ 15989 JAVA) (0) | 2021.10.04 |
백준 21772 자바 - 가희의 고구마 먹방 (BOJ 21772 JAVA) (0) | 2021.10.03 |
백준 11048 자바 - 이동하기 (BOJ 11048 JAVA) (0) | 2021.10.02 |
댓글