본문 바로가기
⌨️ Algorithm/C

1/3 [C] 백준 6359번 - 만취한 상범

by Lucy Oh 2022. 1. 3.

<문제>

 

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

 

6359번: 만취한 상범

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

www.acmicpc.net

 

<내가 제출한 코드> 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
	int testcase,room,i,j;
	int num=0;
	int door[101] = { 0 }; //방들을 배열로 표현함. 0: 문 닫힘, 1: 문 열림
	
	scanf("%d", &testcase);
	while (testcase--) {
		scanf("%d", &room);

		for (i = 0; i < 101; i++) {
			door[i] = 0;
		}

		for (i = 1; i <= room; i++) {
			for (j = i; j <= room; j+=i) { //i의 배수 j에 해당하는 인덱스의 방에선 숫자 바꾸기
				door[j] = !door[j];
			}
		}

		for (num=0,i=1; i <= room; i++) {
			num += door[i]; // 문이 열린 곳을 1로 표현 -> 모두 더하면 나간 사람의 수가 됨.
		}
		printf("%d\n", num);
	}
}

 

방의 개수는 room 으로 표현하였는데 조건이 5개 이상, 100개 이하이므로 door[101]이라는 변수를 선언해 주었다.

door[100]으로 만들어도 가능하지만 코드의 편의를 위해 101로 지정하였다.

-> 첫번째 방의 인덱스를 0이 아닌 1로 만들어주기 위해.

 

testcase가 돌아갈때마다 room변수에 저장되는 숫자를 받고, 이전에 사용한 door배열을 초기화 해주었다.

0은 해당하는 방의 문이 닫혔다는 의미이고 1은 열렸다는 의미이다.

(나중에 숫자세기에 용이하게 만들기 위하여 이렇게 설정함.)

 

각각의 라운드, i=1부터 방의 개수만큼의 라운드를 반복하면서 이중 반복문을 이용해 j가 room이하일때까지 i를 계속 더하여 j를 i의 배수로 표현해 주었고, j에 해당하는 인덱스 배열에선 !를 사용하여 0은 1로, 1은 0으로 바꾸어주었다.

 

탈출한 사람의 수는 모든 배열의 원소를 더하면 구할 수 있다. 

-> 닫힌 방은 0이고 열린 방은 1이므로 모두 더하면 열린방의 개수를 구할 수 있다.

댓글