백준/백준 단계별 문제풀이

백준 10250번 (C++)

FDEE 2020. 8. 25. 14:51

www.acmicpc.net/problem/10250

 

10250번: ACM 호텔

문제 ACM 호텔 매니저 지우는 손님이 도착하는 대로 빈 방을 배정하고 있다. 고객 설문조사에 따르면 손님들은 호텔 정문으로부터 걸어서 가장 짧은 거리에 있는 방을 선호한다고 한다. 여러분은

www.acmicpc.net

 

<답안>

#include <iostream>

using namespace std;

int main()

{

    int t;

    int hight, width, n;

    int h, w;

    int temp;

    int term;

    int result;

    cin>>t;

    

    for(int i=0; i<t; i++)

    {

        cin>>hight>>width>>n;

        h = hight;

        w = n / hight;

        temp = h * w;

        term = n - temp;

        if(term == 0)

        {

            result = h*100 + w;

        }

        else

        {

            w++;

            h = term;

            result = h*100 + w;

        }

        cout<<result<<"\n";

    }

    return 0;

}

 

<설명>

x축, y축을 넣어 생각을 하면, x=1부터 y=1~y=h까지 직사각형 채우고, 그다음 x=2이고 y=1~y=h까지 채우고

그런식으로 채우다가 마지막 채워진 위치 x,y를 구하는 느낌이다

그럴려면, 마지막에 채워지는 x전까지 채워진 직사각형의 가로 x를 먼저 알아야

그다음 x좌표에서 남은칸만큼 y값이 되는 식이다

 

이전 x값인 w를 구하기위한 식으로는

w * 높이 hight <= n 일때 최대 w 값이다 정리하자면 w <= n / hight 인 값이다

프로그래밍 상으론 w = n / hight로 구한다

그러면 채워진 직사각형은 w * hight로 구할수 있고, 남은 칸 term 은 n - (w*hight) 인 셈이다

이때, 두가지의 경우가 생긴다

 

만약 term이 0인 경우, 즉 입력된 n값이 직사각형의 마지막층인 경우

-> 앞에서 구해진 w와 hight가 n번째 위치이므로 그대로 w*100 + hight로 구하면 된다

0이 아닌경우

-> w는 +1을 해야 하고, term 만큼 h가 된다

그렇게 w*100 + hight로 구할 수 있다

 

'백준 > 백준 단계별 문제풀이' 카테고리의 다른 글

백준 1011번 (C++)  (0) 2020.08.28
백준 2775번 (C++)  (0) 2020.08.27
백준 2869번 (C++)  (0) 2020.08.25
백준 1193번 (C++)  (0) 2020.08.23
백준 2292번 (C++)  (0) 2020.08.23