C++

[백준 알고리즘] 6359번 : 만취한 상범, c++

2022. 3. 18. 17:51

https://www.acmicpc.net/problem/6359

 

6359번: 만취한 상범

한 줄에 한 개씩 각 테스트 케이스의 답, 즉 몇 명이 탈출할 수 있는지를 출력한다.

www.acmicpc.net

c++로 백준 6359번 문제를 풀어보겠다.

 

 

 

 

 

문제

서강대학교 곤자가 기숙사의 지하에는 n개의 방이 일렬로 늘어선 감옥이 있다. 각 방에는 벌점을 많이 받은 학생이 구금되어있다.

그러던 어느 날, 감옥 간수인 상범이는 지루한 나머지 정신나간 게임을 하기로 결정했다. 게임의 첫 번째 라운드에서 상범이는 위스키를 한 잔 들이키고, 달려가며 감옥을 한 개씩 모두 연다. 그 다음 라운드에서는 2, 4, 6, ... 번 방을 다시 잠그고, 세 번째 라운드에서는 3, 6, 9, ... 번 방이 열려있으면 잠그고, 잠겨있다면 연다. k번째 라운드에서는 번호가 k의 배수인 방이 열려 있으면 잠그고, 잠겨 있다면 연다. 이렇게 n번째 라운드까지 진행한 이후, 상범이는 위스키의 마지막 병을 마시고 쓰러져 잠든다.

구금되어있는 몇 명(어쩌면 0명)의 학생들은 자신의 방을 잠그지 않은 채 상범이가 쓰러져버렸단 것을 깨닫고 즉시 도망친다.

방의 개수가 주어졌을 때, 몇 명의 학생들이 도주할 수 있는지 알아보자.

입력

입력의 첫 번째 줄에는 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄에 한 개씩 방의 개수 n(5 ≤ n ≤ 100)이 주어진다.

출력

한 줄에 한 개씩 각 테스트 케이스의 답, 즉 몇 명이 탈출할 수 있는지를 출력한다.

예제 입력 1 복사

2
5
100

예제 출력 1 복사

2
10

 

 

 

 

 

<문제 풀이>

1. T를 선언한 후 입력받는다.

2. for문을 T번 반복하며 주어진 문제를 해결한다.

 

- for 반복문 코드 내용 -

n을 입력받는다.

크기가 n인 bool형의 배열에 0을 대입해 배열을 선언한다.

중첩 for문을 통해 방문을 돌며 방문이 열려있으면(1) 방문을 닫고(0), 방문이 닫혀있으면(0) 방문을 연다(1).

     (bool 배열의 값이 0이면 1로, 1이면 0으로 바꿔주겠다는 뜻이다.)

     (그리고 무조건 방문을 열고 닫는 것이 아니라, if문에 "k가 j로 나누었을 때 나누어 떨어져야한다" 라는 조건을 걸어        이에 해당할 때만 여닫도록 한다.)

bool 배열을 돌며 값이 1(방문이 열려있는 것)인 것들만 count한다.

계산한 count값을 출력한다.

다시 for문을 반복한다.

 

 

 

코드는 다음과 같다.