> [!date] published: 2022-02-04 [6359번: 만취한 상범](https://www.acmicpc.net/problem/6359) ## 🌟 문제 서강대학교 곤자가 기숙사의 지하에는 n개의 방이 일렬로 늘어선 감옥이 있다. 각 방에는 벌점을 많이 받은 학생이 구금되어있다. 그러던 어느 날, 감옥 간수인 상범이는 지루한 나머지 정신나간 게임을 하기로 결정했다. 게임의 첫 번째 라운드에서 상범이는 위스키를 한 잔 들이키고, 달려가며 감옥을 한 개씩 모두 연다. 그 다음 라운드에서는 2, 4, 6, ... 번 방을 다시 잠그고, 세 번째 라운드에서는 3, 6, 9, ... 번 방이 열려있으면 잠그고, 잠겨있다면 연다. k번째 라운드에서는 번호가 k의 배수인 방이 열려 있으면 잠그고, 잠겨 있다면 연다. 이렇게 n번째 라운드까지 진행한 이후, 상범이는 위스키의 마지막 병을 마시고 쓰러져 잠든다. 구금되어있는 몇 명(어쩌면 0명)의 학생들은 자신의 방을 잠그지 않은 채 상범이가 쓰러져버렸단 것을 깨닫고 즉시 도망친다. 방의 개수가 주어졌을 때, 몇 명의 학생들이 도주할 수 있는지 알아보자. ## 🌟 입력 입력의 첫 번째 줄에는 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄에 한 개씩 방의 개수 n(5 ≤ n ≤ 100)이 주어진다. ## 🌟 출력 한 줄에 한 개씩 각 테스트 케이스의 답, 즉 몇 명이 탈출할 수 있는지를 출력한다. ## 🌟 풀이 복잡하게 생각할 필요 없다. 그냥... 반복문 중첩해서 구구단 구현해서 해당하는 방들 열었다 닫았다 해 주고 마지막까지 열려있는 방의 개수를 구해주면 된다. (설명하는 것 보다 코드를 보는게 더 쉬울 듯 하다.) 생각한 그대로를 코드로 구현할 수 있는지를 묻는 문제인 것 같다. ## 🌟 코드 ```cpp /* 2022-2-3 6359_만취한 상범 https://www.acmicpc.net/problem/6359 */ #include <iostream> using namespace std; int t, n, cnt; bool room[101]; int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> t; while (t--){ cin >> n; // 초기화 cnt = 0; for (int i = 1; i <= n; i++) room[i] = false; // 잠금 // 열려있으면 잠그기, 잠겨있으면 열기 for(int k = 1; k <= n; k++){ for(int i = 1; i * k <= n; i++){ if (room[i * k]) room[i * k] = false; else room[i * k] = true; } } // 열려있는 것 세어주기 for(int i = 1; i <= n; i++){ if (room[i]) cnt++; } cout << cnt << '\n'; } return (0); } ```