https://www.acmicpc.net/problem/10250
10250번: ACM 호텔
프로그램은 표준 입력에서 입력 데이터를 받는다. 프로그램의 입력은 T 개의 테스트 데이터로 이루어져 있는데 T 는 입력의 맨 첫 줄에 주어진다. 각 테스트 데이터는 한 행으로서 H, W, N, 세 정수
www.acmicpc.net
이 문제는 코드가 2개 있습니다. 우선 구린 코드
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void) {
int t, H, W, N, count = 0, temp1 = 0, temp2 = 0;
scanf("%d", &t);
for (int i = 0; i < t; i++) {
scanf("%d%d%d", &H, &W, &N);
for (int j = 1; j <= W; j++) {
for (int k = 1; k <= H; k++) {
count++;
temp1 = k;
temp2 = j; // k와 j는 루프 안에서만 선언된 변수기 때문에
if (count == N) break;
}
if (count == N) {
if (temp2 >= 10) { printf("%d%d\n", temp1, temp2); count = 0; break; } //1111호여야하는데 11011호가 될 수 있어서
else { printf("%d0%d\n", temp1, temp2); count = 0; break; }
}
}
}
return 0;
}
문제의 서술에 맞게 반복문을 작성하면 풀 수 있는 문제였다.
count가 변수가 N과 같아질 때까지 K(높이)를 먼저 증가시키고
K(높이)가 최대에 달하면 다시 J(폭)을 1증가시켜 K를 1부터(XX1호) 받아주는 반복문이다.
이때,K와 J는 반복문 루프 안에서만 선언된 변수이고 반복문 루프를 탈출하면 값을 잃어버리기 때문에
temp1,temp2 변수를 선언하여 K와 J의 값을 대신 정의해줬다.
count 변수가 입력한 N과 같아지면,반복문을 탈출하여 N값에 해당하는 방 번호를 출력한다.
이때 주의해야할 것이 N값에 해당하는 temp2가 10 이상일 때는
중간에 0없이 그대로 출력해주어야 방 번호가 정상적으로 나온다.
이 문제를 풀고나서 코드를 다시 보니 반복문을 3개나 사용한 것이 쎄했다.
아니나 다를까 다른 분들의 풀이를 보니 1개 또는 2개가 쓰였다.
그래서 규칙을 찾아봤다!
상대적으로 덜 구린 코드
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void) {
int t, H, W, N, temp1 = 0, temp2 = 0;
scanf("%d", &t);
for (int i = 0; i < t; i++) {
scanf("%d%d%d", &H, &W, &N);
temp1 = N % H;
temp2 = (N / H) + 1;
if (temp1 == 0) {
temp1 = H;
temp2 -= 1;
}
if (temp2 >= 10) { printf("%d%d\n", temp1, temp2); }
else { printf("%d0%d\n", temp1, temp2); }
}
return 0;
}
temp1변수와 temp2변수가 정의되는 방식은 호텔의 구조를 그려보며 생각하니 금방 알 수 있었다.
첫번째 조건문없이 덜컥 제출했다가 틀렸습니다!를 보았는데
H와 N의 값이 같아 나머지가 0인 경우를 고려해주지 않는다면 0XX가 나오게 된다. 따라서 그 부분을 고려해줬다.
다른 사람의 코드를 보며 알게 된 점
전혀 몰랐던 개념은 아니고.. 알고 있음에도 써먹지 못한 개념이 있다.
자릿수에 맞춰 0을 출력하게 코드를 구성하기.
(위 방법을 사용했다면 마지막 조건문을 사용하지 않아도 되었다.)
#include <stdio.h>
int main() {
printf("%5d\n",125);
printf("%05d\n",125);
return 0;
}
두 printf함수의 출력 차이점은 첫째 줄은 __125인 반면 두번째 줄은 00125이다.
자리수를 맞춰준다는 점에서 동일하지만
두번째 처럼 기술할 시 자릿수를 맞추되 공백 부분을 0으로 채우기 된다.
위 문제에 적용하여 조건문을 굳이 사용하지 않고
printf("%d%02d",temp1,temp2)로 출력했다면 되었을 것이다.
'Baekjoon' 카테고리의 다른 글
[C]백준 1316번 : 그룹 단어 체커 (0) | 2023.01.25 |
---|---|
[C] 백준 2775번 : 부녀회장이 될테야 (0) | 2023.01.20 |
[C]백준 2869번 : 달팽이는 올라가고 싶다 (0) | 2023.01.19 |
[C] 백준 1193번 : 분수찾기 (0) | 2023.01.19 |
[C] 백준 2292번 : 벌집 (0) | 2023.01.18 |