[백준] ACM 호텔 JAVA
문제를 읽으면서는 복잡해보여서 이게 뭐람.. 했는데 의외로 쉽게 풀 수 있었다.
문제에서 Width 값을 받는데 코드에서는 사용되지 않는다.
하지만 다음 스캐너 값을 받기 위해 선언해 두었다.
풀이
nRow
층까지 1번 방들을 모두 채우고, 2번 방으로 넘어가 또 nRow
층까지 채우는 방식이다.
따라서 층수를 의미하는 nFloor
변수와 방 번호를 의미하는 nWindow
변수를 선언해서 층수와 방번호를 따로 계산했다.
nCustomer
가 nRow
보다 크다면 방 번호가 옆으로 밀리게 된다.
nCustomer
가 nRow
만큼 층을 이동하는 횟수, 즉 nCustomer
를 nRow
로 나눈 몫만큼 방 번호가 증가한다.
따라서 nCustomer/nRow를 nWindow
에 더해준다.
그리고 nCustomer
값을 nCustomer % nRow로 바꿔준다.
만약 nCustomer % nRow가 0이 됐을 때는 nWindow
값을 감소시키는데,
몫의 값이 밀리는 방의 개수를 의미하기 때문에 방 번호의 초기화 값은 0이 아니라 1이었다.
그런데 nCustomer % nRow가 0인 경우,
예를 들어 nCustomer
가 6이고, nRow
도 6일 때 실제로는 방이 밀리지 않고 꼭대기에 있지만 아래 계산에 따르면 방이 밀린 것으로 계산된다.
따라서 나머지가 0이 되었을 경우에는 맨 앞 방의 계산 값인 1을 빼주는 것이다.
이후 nCustomer
를 nRow
로 나눈 값의 나머지가 층 수이기 때문에 남은 값만큼 nFloor
값을 증가시켜 준다.
이 때 만약 nCustomer
를 nRow
로 나눈 나머지가 0이 된다면 맨 꼭대기 층에 있다는 것을 의미하므로 nFloor
에 nRow
값을 넣어준다.
계산이 완료 된 후, 층수는 백의 자리이기 때문에 nFloor
를 100배로 증가시키고 nFloor
와 nWindow
를 더한 값을 출력한다.
코드
import java.util.Scanner;
public class Main {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
int nTestCase = sc.nextInt();
for(int i = 0; i < nTestCase; i++) {
int nRow = sc.nextInt();
int nCol = sc.nextInt();
int nFloor = 0;
int nWindow = 1;
int nCustomer = sc.nextInt();
if(nCustomer > nRow) {
nWindow += nCustomer/nRow;
if(nCustomer % nRow == 0) nWindow--;
nCustomer %= nRow;
}
for(int j = 0; j < nCustomer; j++) {
nFloor++;
}
if(nCustomer == 0) nFloor += nRow;
nFloor *= 100;
System.out.println(nFloor + nWindow);
}
}
}