====== 지우개 ====== ===== 풀이 ===== * N 제한이 매우 작아서 그대로 시뮬레이션을 돌려봐도 된다. 매 루프에서 길이 N/2, N/4, N/8, ..짜리 리스트들을 새로 만드는 식으로 구현한다면 총 시간 복잡도는 O(N) * 하지만, 더 쉬운 방법이 있다. 동작 방식을 보면, 2k+1 꼴의 숫자들을 지우고, 4k+2 꼴의 숫자들을 지우고, 8k+4꼴의 숫자들을 지우고,.. 하는 식이다. 이것은 다시 말하면 2의 배수만 남기고 지우고, 다음엔 4의 배수만 남기고 지우고, 8의 배수만 남기고 지우고.. 하는 것과 같다. 이렇게 해서 2^i의 배수가 한개만 남으면 그 수를 출력하는 것이므로, 바꿔 말하면 n이하에서 가장 큰 2의 거듭제곱수를 찾아서 출력하면 된다. 이것은O(1)에 계산 가능. ===== 코드 ===== ==== 코드 1 - O(n) ==== """Solution code for "BOJ 21756. 지우개". - Problem link: https://www.acmicpc.net/problem/21756 - Solution link: http://www.teferi.net/ps/problems/boj/21756 """ def main(): N = int(input()) l = list(range(1, N + 1)) while len(l) > 1: l = l[1::2] print(l[0]) if __name__ == '__main__': main() ==== 코드 2 - O(1) ==== """Solution code for "BOJ 21756. 지우개". - Problem link: https://www.acmicpc.net/problem/21756 - Solution link: http://www.teferi.net/ps/problems/boj/21756 """ def main(): N = int(input()) print(1 << (N.bit_length() - 1)) if __name__ == '__main__': main() {{tag>BOJ ps:problems:boj:브론즈_2}}