본문 바로가기

백준

10250 ACM 호텔

택시기하학의 영향으로  처음에 기하학문제인줄 알았다. 그런데 문제를 읽어보니 엘리베이터가 있고 가장 아래쪽에서 방을 차지하기 때문에 사진과 같은 순서로 방이 찬다고 생각했다. 이렇게 하면 조건에 맞게 채워질 줄 알았음

 

#include <iostream>

int main() {
    int t, h, w, n;
    scanf("%d", &t);
    for(int i = 0; i < t; i++){
        scanf("%d %d %d", &h, &w, &n);
        printf("%d%02d\n", n%h, n/h + 1);
    }
}

그래서 코드를 이렇게 짰다.  한 줄 입력받아 한 줄 출력하게끔 하고, 몫과 나머지를 구하는데 한자리 수를 출력할때는 0을 붙여야 하므로 %02d를 사용했다. 

 

그리고 예제 입력을 돌려봤는데 그대로 나왔다. 

 

하지만 실패..ㅎㅎ 정답률이 낮은 이유가 있었다. 

지금 다시 봐서는 어디가 틀린지 잘 모르겠다. 엘리베이터 안 쓰고도 올라갈 수 있으니 이렇게 올라가는게 더 좋을 수도 있지 않을까 생각했는데 이것보다는 항상 엘리베이터를 타는게 더 빠른 것 같다. (꺾어 올라가는 것 보다 엘베 타서 직선거리로 가는 게 더 빠르므로)

 

그 다음 의심가는게 호 수를 잘못 구했나 싶다. 왜냐면 w를 입력 받아놓고 쓰지를 않아서 w를 써서 구해야 했어야 하는 문제인가 싶기도 하고.

 

아니면 또 계산하다 터졌나? 싶은데 그러기에는 값이 너무 작다. 

 

이 다음에는 방이 꽉 찼다고 생각하고 6 1 6을 넣어봤다. 정상으로 들어갔다면  601호가 나와야 할것이다. 그런데 002호가 나왔다. 여기서 틀렸구나! 어디서 틀렸는지 알았으니 이건 수업 듣고 와서 다시 풀어봐야겠다.


 

결국 저 위의 나눠떨어지는 것들이 문제인 것이다..

그래서 나눠떨어질 때는 어떻게 동작을 하는지 알아보고 경우를 나눠서 구분을 했다.

 

#include <iostream>

int main() {
    int t, h, w, n;
    scanf("%d", &t);
    for(int i = 0; i < t; i++){
        scanf("%d %d %d", &h, &w, &n);
        if(n%h == 0)
            printf("%d%02d\n", h, n/h);
        else
            printf("%d%02d\n", n%h, n/h + 1);
    }
}

그대로 코드로 바꿨다. 

 

맞았다! 다음에는 가장 작은 값 - 가장 큰 값처럼 경계에 있는 값들도 확인해봐야겠다. 

이제 이 코드를 조건문으로 확인 안 하고 한줄로 짜고 싶었는데 어떻게 할지는 잘 모르겠다. 번호 구하는 건 나눠떨어지면 H, 안 나눠떨어지면 H + 1이라 올림으로 합칠 수 있을 것 같은데 앞의 층 수가 문제다. 그래서 그냥 이대로 뒀다. 

 

여담이지만 백준 틀린거는 돌리자마자 알려주는데 맞는거는 한 5초정도 기다렸다가 알려준다. 빠른 실패 느린 성공

'백준' 카테고리의 다른 글

2965 캥거루 세마리  (0) 2019.10.04
10824 네 수  (0) 2019.10.04
2455 지능형 기차  (0) 2019.10.03
13458 시험 감독  (0) 2019.10.03
2869 달팽이는 올라가고 싶다  (0) 2019.10.03