티스토리 뷰
문제 링크 : https://www.acmicpc.net/problem/10250
문제 |
ACM 호텔 매니저 지우는 손님이 도착하는 대로 빈 방을 배정하고 있다. 고객 설문조사에 따르면 손님들은 호텔 정문으로부터 걸어서 가장 짧은 거리에 있는 방을 선호한다고 한다. 여러분은 지우를 도와 줄 프로그램을 작성하고자 한다. 즉 설문조사 결과 대로 호텔 정문으로부터 걷는 거리가 가장 짧도록 방을 배정하는 프로그램을 작성하고자 한다.
문제를 단순화하기 위해서 호텔은 직사각형 모양이라고 가정하자. 각 층에 W 개의 방이 있는 H 층 건물이라고 가정하자 (1 ≤ H, W ≤ 99). 그리고 엘리베이터는 가장 왼쪽에 있다고 가정하자(그림 1 참고). 이런 형태의 호텔을 H × W 형태 호텔이라고 부른다. 호텔 정문은 일층 엘리베이터 바로 앞에 있는데, 정문에서 엘리베이터까지의 거리는 무시한다. 또 모든 인접한 두 방 사이의 거리는 같은 거리(거리 1)라고 가정하고 호텔의 정면 쪽에만 방이 있다고 가정한다.
방 번호는 YXX 나 YYXX 형태인데 여기서 Y 나 YY 는 층 수를 나타내고 XX 는 엘리베이터에서부터 세었을 때의 번호를 나타낸다. 즉, 그림 1 에서 빗금으로 표시한 방은 305 호가 된다.
손님은 엘리베이터를 타고 이동하는 거리는 신경 쓰지 않는다. 다만 걷는 거리가 같을 때에는 아래층의 방을 더 선호한다. 예를 들면 102 호 방보다는 301 호 방을 더 선호하는데, 102 호는 거리 2 만큼 걸어야 하지만 301 호는 거리 1 만큼만 걸으면 되기 때문이다. 같은 이유로 102 호보다 2101 호를 더 선호한다.
여러분이 작성할 프로그램은 초기에 모든 방이 비어있다고 가정하에 이 정책에 따라 N 번째로 도착한 손님에게 배정될 방 번호를 계산하는 프로그램이다. 첫 번째 손님은 101 호, 두 번째 손님은 201 호 등과 같이 배정한다. 그림 1 의 경우를 예로 들면, H = 6이므로 10 번째 손님은 402 호에 배정해야 한다.
입력 |
프로그램은 표준 입력에서 입력 데이터를 받는다. 프로그램의 입력은 T 개의 테스트 데이터로 이루어져 있는데 T 는 입력의 맨 첫 줄에 주어진다. 각 테스트 데이터는 한 행으로서 H, W, N, 세 정수를 포함하고 있으며 각각 호텔의 층 수, 각 층의 방 수, 몇 번째 손님인지를 나타낸다(1 ≤ H, W ≤ 99, 1 ≤ N ≤ H × W).
출력 |
프로그램은 표준 출력에 출력한다. 각 테스트 데이터마다 정확히 한 행을 출력하는데, 내용은 N 번째 손님에게 배정되어야 하는 방 번호를 출력한다.
#include <iostream>
#include <algorithm>
using namespace std;
int main(void)
{
int count, H, W, N;
cin >> count;
for (int i = 0; i < count; i++)
{
int result, room_height, room_num;
cin >> H >> W >> N;
if (N % H == 0)
{
room_height = H * 100;
room_num = N / H;
}
else
{
room_height = (N % H) * 100;
room_num = (N / H) + 1;
}
result = room_height + room_num;
cout << result << endl;
}
return 0;
}
스택 같은 어려운 자료 구조를 요구하는 문제는 아니고 쉽게 푼다면 쉽게, 어렵게 푼다면 어렵게 풀릴 수 있는 문제이다. 처음에 문제를 딱 보고 이거 2차원 배열을 활용해서 풀어야하나 고민을 잠깐 했었는데, 방 배정 방식에 규칙이 있어서 공식을 만들어 풀었다.
문제의 규칙대로라면 손님을 방에 배정할 때는 X01호 방부터 채운다. 그리고 X02호, X03호, X04호... 순서대로 그림 상에서는 왼쪽에서 오른쪽 열로 채워나간다. 그렇다면 1의 자리, 10의 자리 수는 앞의 열이 몇 줄이나 채워졌느냐에 따라 갈리게 되고, 층수는 앞의 열을 채우고도 몇 명의 손님을 더 채워야 하는가에 따라서 달라진다.
테스트 케이스로 주어진 [6, 12, 10]를 보자. 이 경우 높이(H)가 6, 너비(W)가 12, 구하고자 하는 손님의 순서(N)가 10이다. 높이가 6이므로 1열당 최대 6명까지 채울 수 있고 X01번대 호수들은 무조건 다 채워진다. 그럼 남는 손님들은? 4명이다. X02번대 호수에 4명을 채우면 되는데 앞에 층수는 손님 1명당 층수가 1씩 올라가므로 402호가 된다.
여기서 예외 처리를 잘 해주어야 할 것이 N / H를 해서 방 번호(room_num)을 정하게 되는데, 완전히 꽉 차버려서 나머지가 0이 나오면 그대로 해당 열의 방 번호를 사용하면 된다. 하지만 나머지가 남을 경우 다음 열에서 방 번호가 정해지게 되므로 +1 처리를 해주어야 한다. 층수(room_height)도 마찬가지. N % H를 해서 나머지가 0이 나온다면 이 말은 구하고자 하는 손님의 배정 방이 해당 열의 꼭대기 층이라는 의미이다. 이럴 경우에는 그냥 열의 높이(H) 값을 그대로 층수로 사용하면 된다.
'백준 알고리즘' 카테고리의 다른 글
백준 4948번 : 베르트랑 공준 [Java] (0) | 2021.08.17 |
---|---|
백준 9012번 : 괄호 [스택/C/C++] (0) | 2020.04.30 |
백준 1712번 : 손익분기점 [수학/C/C++] (0) | 2020.04.25 |
백준 17828번 : 문자열 화폐 [문자열/스택/C/C++] (0) | 2020.04.23 |
백준 1316번 : 그룹 단어 체커 [문자열/C/C++] (0) | 2020.04.22 |
- Total
- Today
- Yesterday
- 코드 리뷰
- C++
- 코딩테스트
- 알고리즘 문제
- 컴퓨터과학과
- 컴퓨터공학
- 알고리즘
- 서블릿
- 컴퓨터공학과
- 컴퓨터
- 코딩
- 컴퓨터과학
- 웹개발
- 백준
- 인터넷
- TCP
- 프로그래밍
- Servlet
- 자바
- 컴퓨터 네트워크
- 컴퓨터이론
- java
- 컴퓨터기초
- C언어
- 네트워크
- 알파넷
- It
- jsp
- 코딩 테스트
- 백준 풀이
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |