https://www.acmicpc.net/problem/10250
문제 설명
이번 문제는 설명이 상당히 길었습니다. 문제를 푸는 것보다 문제를 이해하는 게 더 걸렸네요..
간단히 문제에 대해 설명하자면 손님이 정문에서 나와서 엘리베이터를 타서 방을 들어가려고 한다고 합니다.
손님은 정문에서 나와서 엘리베이터 걸어가는데 걸리는시간, 엘리베이터 이동하는 거리는 전부 신경 쓰지 않고
엘리베이터를 타고 나올때 오로지 가까운 방에 들어가는 걸 선호합니다.
예를 들어 101호 -> 201호 -> 301호 -> 401 호 이런식으로 엘리베이터와 가까운 쪽의 방을 선호합니다.
방 한칸당 거리는 1로 생각합니다.
입력에는 호텔의 H , W (크기)와 몇번째 손님(N)인지 입력받고 그 손님이 어떤 방에 들어가야 할지 출력하는 것이 문제입니다.
ex) H = 6 W = 12에서 3번째 손님이 들어오면 301호, 7번쨰 손님이 들어오면 601호까지 다 찼으므로 102호로 배정해주면 됩니다.
소스코드 & 설명
이 문제는 #14652번과 유사한데요.
이 문제 역시 H , W 와 N번째 손님과 방 번호의 규칙성을 찾아내야 합니다.
수학에 분류되었고 시간제한이 1초이기 때문에 반복문을 풀면 대부분 시간 초과가 뜹니다.
예제 입력을 보면
6 12 10 => 402
30 50 72 => 1203
이라고 나와있는데 이걸 뚫어져라 봐보면
10을 6으로 나눈 나머지 => 4
10을 6으로 나눈 몫 + 1 => 2
:: 중간에 0붙여서 출력해주면 402
72를 30으로 나눈 나머지 => 12
72를 30으로 나눈 몫 + 1 => 3
:: 중간에 0붙여서 출력해주면 1203
위와 같은 규칙이 있다는것을 알 수 있습니다.
방번호는 YXX나 YYXX형태인데 612호 같은것도 있는걸로 봐선 손님 번호수(N)을 나눈 몫 + 1 의 값이 한자리일땐 0을붙여서 출력하고 아닐땐 그냥 출력하면 될거 같습니다.
그리고 저 위 규칙을 적용할때 주의할점이 있는데 위 사진 H = 6 W = 12를 기준으로 601, 602호 같이 꼭대기 층은 몫이 나누어 떨어지기때문에 +1을 앞에서 해줬다면 -1로 하나 빼줘야 합니다.
규칙을 찾으면 쉽게 풀 수 있는 문제이며 꼭대기 층, 나눈 몫이 한자리인지 두자리인지 유념해서 풀이해주시면 되겠습니다.
#include <stdio.h>
int main(){
int repeat_count;
scanf("%d", &repeat_count);
for (int i = 0; i < repeat_count; i++){
int h,w,n;
scanf("%d %d %d", &h, &w, &n);
int start = n % h;
int end = n / h + 1;
if (start == 0){ //나머지가 0인경우 (맨위층으로 생각한다.)
start = h;
end = end - 1; //끝 번호도 1빼줘야 한다. (몫이 잘 떨어진다.)
}
//방번호는 YXX나 YYXX 형태임.
if(end / 10 == 0){ //한자리수면
printf("%d0%d\n", start, end); //중간에 0껴서 출력해준다.
} else { //그게 아니면 그냥 출력한다.
printf("%d%d\n",start,end);
}
}
return 0;
}
'프로그래밍 > BaekJoon' 카테고리의 다른 글
[Baekjoon] 10989번: 수 정렬하기 3 (0) | 2021.06.09 |
---|---|
[Baekjoon 파이썬] 1929번: 소수 구하기 (0) | 2021.06.03 |
[Baekjoon 파이썬] 14652번: 나는 행복합니다~ (0) | 2021.05.17 |
[Baekjoon C언어] 9488번 시험성적 / 항상 A를 출력하는 이유 (0) | 2020.01.05 |
[Baekjoon 파이썬] 1237번 정ㅋ벅ㅋ (0) | 2020.01.05 |