반응형
문제
서강대학교 곤자가 기숙사의 지하에는 n개의 방이 일렬로 늘어선 감옥이 있다. 각 방에는 벌점을 많이 받은 학생이 구금되어있다.
그러던 어느 날, 감옥 간수인 상범이는 지루한 나머지 정신나간 게임을 하기로 결정했다. 게임의 첫 번째 라운드에서 상범이는 위스키를 한 잔 들이키고, 달려가며 감옥을 한 개씩 모두 연다. 그 다음 라운드에서는 2, 4, 6, ... 번 방을 다시 잠그고, 세 번째 라운드에서는 3, 6, 9, ... 번 방이 열려있으면 잠그고, 잠겨있다면 연다. k번째 라운드에서는 번호가 k의 배수인 방이 열려 있으면 잠그고, 잠겨 있다면 연다. 이렇게 n번째 라운드까지 진행한 이후, 상범이는 위스키의 마지막 병을 마시고 쓰러져 잠든다.
구금되어있는 몇 명(어쩌면 0명)의 학생들은 자신의 방을 잠그지 않은 채 상범이가 쓰러져버렸단 것을 깨닫고 즉시 도망친다.
방의 개수가 주어졌을 때, 몇 명의 학생들이 도주할 수 있는지 알아보자.
입력
입력의 첫 번째 줄에는 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄에 한 개씩 방의 개수 n(5 ≤ n ≤ 100)이 주어진다.
출력
한 줄에 한 개씩 각 테스트 케이스의 답, 즉 몇 명이 탈출할 수 있는지를 출력한다.
예제 입력2
5 100 |
예제 출력2
10 |
풀이
1부터 n까지 반복하며 해당 수의 배수인 번호의 방문을 모두 반전한다.
반복이 끝나면 sum을 이용해 열려있는 방의 수를 출력한다.
import sys
input = sys.stdin.readline
for _ in range(int(input())):
n = int(input())
prison = [False] + [False]*n
for i in range(1,n+1):
for j in range(i,n+1,i):
prison[j] = not prison[j]
print(sum(prison)) # True = 1, False = 0 으로 인식된다.
반응형
'알고리즘 연습 > 구현, 문자열' 카테고리의 다른 글
[🥉1 / 백준 2669 / 파이썬] 직사각형 네개의 합집합의 면적 구하기 (0) | 2021.12.14 |
---|---|
[🥉1 / 백준 2851 / 파이썬] 슈퍼 마리오 (0) | 2021.12.11 |
[🥈2 / 백준 1138 / 파이썬] 한 줄로 서기 (0) | 2021.12.07 |
[🥈5 / 백준 5635 / 파이썬] 생일 (0) | 2021.12.05 |
[🥉2 / 백준 2864 / 파이썬] 5와 6의 차이 (0) | 2021.12.01 |