문제

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

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

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

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

 

 

조건 및 입출력

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

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

- 시간 제한: 1초 이내 / 메모리 제한: 128MB

 

 

코드 ( Java 11)
import java.util.*;

public class Main 
{	
	public static void main(String[] args)
	{
		Scanner scanner=new Scanner(System.in);
        int trys=scanner.nextInt();

		boolean room[]=new boolean[101]; //0번 인덱스 사용 X

		for(int i=1;i<=trys;i++)
		{
			int n=scanner.nextInt();
			int result=0;
			for(int j=1;j<=n;j++)
				room[j]=false; //초기화: false->잠금 True->열림
			
			for(int j=1;j<=n;j++)
			{
				for(int k=1;k<=n;k++)
				{
					if(k%j==0)
						room[k]=!room[k]; 
				}
			}

			for(int j=1;j<=n;j++)
			{
				if(room[j])
					result++;
			}
			System.out.println(result);
		}
		scanner.close();
	}			
}

 

 


여담

감옥의 방 번호(인덱스)는 1번부터 시작하므로, 과감히 0번 인덱스는 버렸다.

0번을 시작점으로 잡으면 코드를 작성할 때나 계산할 때마다 0번을 고려해야 하기 때문이다.

처음부터 시작 지점을 1번으로 잡으면 모든 것이 해결된다.

 

처음에는 모든 방이 잠겨 있을 것이다. 잠겨 있는 상태를 false로 가정하여, 모든 배열에 false 값을 대입한다.

그 후 n라운드 마다 n번방이 열리게 될 것이므로, 이중 for문을 돌리면서 외부 루프는 방 번호를 참고하고, 내부 루프는 라운드 번호를 참조하여 n라운드에 해당하는 방 번호의 잠금을 해제한다.

 

만약, n번방이 열려있다면 다시 문을 닫아야 한다.

이를 부정 연산자(!)를 이용하여 해결하였다.

true면 false로, false면 true로 바꾸면 간단히 해결할 수 있다.

 

그렇게 하여, 모든 라운드가 끝났을 때, 열려있는 방을 확인한다.

즉, 모든 방을 체크하여 열려 있는지 확인하면 된다.

 

for문을 통해 배열에서 true를 만나면 카운트 변수(result)에 +1을 해주고 최종적으로 카운트 변수를 출력한다.

 


여담

최근들어 Java를 공부하느라 블로그에 글을 잘 올리지 못했다.

 

그래서 오늘 게시물은 그동안 배웠던 Java 문법을 이용하여 문제를 풀어보았다.

 

처음으로 객체지향 언어를 배우는데, C 같으면서도 Python 같기도 하고...

뭔가 오묘하다...

 

오늘 클래스와 객체, 상속에 대해 공부할 예정인데

벌써부터 겁이난다. 

 

오늘 하루도 화이팅!

 

코드가 이상하거나, 이해되지 않는 부분이 있다면 댓글 남겨주세요!

+ 더 좋은 풀이 방법이 있다면 알려주세요 :)

 

+ Recent posts