티스토리 뷰
문제
https://www.acmicpc.net/problem/10250
방의 개수가 h * w인 호텔에 손님이 올 때마다 엘레베이터와 가까운 순서대로 방을 배정하고
n번째 손님이 어느 방에 배정될 것인지를 찾는 문제.
난이도
난이도 下, 소요시간 20분 이내
풀이 과정
h : 호텔의 층 수
w : 한 층당 방 수
n : n번째 손님
101호 -> 201호 -> 301호 -> ... -> h01호 ->
102호 -> 202호 -> 302호 -> ... -> h02호 -> ...
순이므로 n번째 손님은 n % h층으로 들어갈 것임을 먼저 생각해볼 수 있고
호수는 n / h의 몫에 1을 더한 것임을 쉽게 알 수 있다.
즉, n%h층 n/h + 1호 가 된다.
건물의 왼쪽 줄부터 채워지기 시작하기 때문에 w는 식에 필요가 없지만
범위를 제한하기 위해서 쓰인다.
호수가 w를 초과해서는 안되므로 n/h + 1 <= w 가 된다.
규칙이 복잡하지 않고 매우 단순하다.
.
.
.
.
.
.
라고 생각했지만
제출했더니 실패가 나왔다...
테스트 케이스를 아무거나 넣어가면서 몇 번 해보고 문제를 알게 되었다.
n이 h로 나누어 떨어질 때 004호 와 같은 식으로 나온다는 것.
따져보면 n이 h로 나누어 떨어질 때는 손님이 h층에 입실하게 된다.
그리고 1층으로 되돌아가지 않으므로 호수는 n/h + 1호가 아니라 n/h호가 된다.
따라서 다음과 같이 코드를 짜면 된다.
#include <iostream> using namespace std; int main(void) { int test = 0; cin <> test; for (int t = 0; t < test; t++) { int h = 0, w = 0, n = 0; cin >> h; cin >> w; cin >> n; int floor = (n % h == 0) ? h : n % h; // 층 수(n이 h로 나누어 떨어지면 층 수 = h) int room = (floor == h) ? n / h : n / h + 1; // 호 수(n이 h로 나누어 떨어지면 +1을 하지 말아야 함) if (room > w) // 한 층당 방의 개수를 초과하여 방이 존재할 수 없으므로 예외처리 break; cout << floor; if (room < 10) cout << 0; // 호수가 1~9호라면 호수 앞에 0을 붙여줌 cout << room << endl; } return 0; }
'알고리즘 > BOJ' 카테고리의 다른 글
[BOJ] 9020 - 골드바흐의 추측 (0) | 2018.05.02 |
---|---|
[BOJ] 2581 - 소수, 1929 - 소수 구하기 (0) | 2018.04.30 |
[BOJ] 1316 - 그룹 단어 체커 (0) | 2018.04.16 |
[BOJ] 2292 - 벌집 (0) | 2018.04.15 |
[BOJ] 4344 - 평균은 넘겠지 (0) | 2018.04.03 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 윈도우xp
- VMware
- Leap motion pencil
- Leap motion SDK
- Leap motion stick
- 설치
- Leap motion
- WindowsXP
- Tool Tracking
- 툴
- 립 모션
- Leap motion pen
- windows10
- 가상머신
- C++
- VirtualBox
- # 보안 # 나만의 # 백신 # 만들기 #안티 #바이러스 #파이썬 #악성코드
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함