티스토리 뷰

728x90
반응형

백준 온라인 저지(BOJ) 10250번 ACM 호텔

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

 

10250번: ACM 호텔

프로그램은 표준 입력에서 입력 데이터를 받는다. 프로그램의 입력은 T 개의 테스트 데이터로 이루어져 있는데 T 는 입력의 맨 첫 줄에 주어진다. 각 테스트 데이터는 한 행으로서 H, W, N, 세 정수

www.acmicpc.net

* 사용언어 : C언어, C++

 

 

1. 문제

아래와 같은 호텔이 주어질 때, N 번째 손님에게 배정할 방 번호를 출력

(YXX or YYXX 형태로)

 

2. 풀이

글자가 많아서 문제가 어려워보이는데

잘 읽어보면 사실 /, % 연산만으로 풀 수 있는 간단한 문제입니다.

하지만 직접 문제를 풀 때는 복잡해보였기 때문에 차근차근 접근해보았습니다.

 

우선 X 부터 생각해보겠습니다.

위 예시에서 X 는 N 이 1 ~ 6 까지 1 이고, 7 ~ 12 까지 2 입니다.

즉, X 는 N 을 H 로 나눈 몫에서 1을 더해준 값이 됩니다.

x = n / h + 1;

 

다음은 Y 입니다.

규칙을 생각해보면 Y 는 N = 1, 7, 13, ...일 때 1 이고,

N = 2, 8, 14, ... 일 때 2 입니다.

즉, N 을 H 로 나눈 나머지(%)가 됩니다.

y = n % h;

 

단, 이와 같이 풀 경우 꼭대기층에서 오류가 발생합니다.

예를 들어 6번째 손님인 경우 x = 2 가 되고 y = 0 이 되지만,

실제 손님을 배정하는 방은 601호여야 합니다. (x = 1, y = 6)

 

같은 맥락으로 12번째 손님인 경우 x = 3, y = 0 이 되지만,

실제 손님을 배정하는 방은 602호여야 합니다. (x = 2, y = 6)

 

따라서 y 가 0 이 된 경우 꼭대기 층이라는 의미이므로

y 는 h 로 바꿔주고, x 는 앞서 구한 값에서 1 을 빼주면 됩니다.

 

3. 코드

#include <stdio.h>

int main() {
	int t;
	scanf("%d", &t);

	int h, w, n, y, x;

	for (int i = 0; i < t; ++i) {
		scanf("%d %d %d", &h, &w, &n);

		x = n / h + 1;
		y = n % h;

		if (y == 0) {
			y = h;
			x -= 1;
		}

		printf("%d%02d\n", y, x);
	}
	
	return 0;
}

* %d 앞에 0 과 숫자(자리수)를 넣으면 부족한 자리에 0을 채워줍니다.

728x90
반응형
댓글