백준

10250 ACM 호텔

불타는강정 2019. 10. 4. 08:12

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

 

#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초정도 기다렸다가 알려준다. 빠른 실패 느린 성공