백준_ACM 호텔 문제
풀이 코드

문제를 읽으면서는 복잡해보여서 이게 뭐람.. 했는데 의외로 쉽게 풀 수 있었다.

문제에서 Width 값을 받는데 코드에서는 사용되지 않는다.
하지만 다음 스캐너 값을 받기 위해 선언해 두었다.

풀이

nRow층까지 1번 방들을 모두 채우고, 2번 방으로 넘어가 또 nRow층까지 채우는 방식이다.

따라서 층수를 의미하는 nFloor변수와 방 번호를 의미하는 nWindow변수를 선언해서 층수와 방번호를 따로 계산했다.

nCustomernRow보다 크다면 방 번호가 옆으로 밀리게 된다.
nCustomernRow만큼 층을 이동하는 횟수, 즉 nCustomernRow로 나눈 몫만큼 방 번호가 증가한다.
따라서 nCustomer/nRow를 nWindow에 더해준다.
그리고 nCustomer값을 nCustomer % nRow로 바꿔준다.

만약 nCustomer % nRow가 0이 됐을 때는 nWindow값을 감소시키는데,
몫의 값이 밀리는 방의 개수를 의미하기 때문에 방 번호의 초기화 값은 0이 아니라 1이었다.

그런데 nCustomer % nRow가 0인 경우,
예를 들어 nCustomer가 6이고, nRow 도 6일 때 실제로는 방이 밀리지 않고 꼭대기에 있지만 아래 계산에 따르면 방이 밀린 것으로 계산된다.
따라서 나머지가 0이 되었을 경우에는 맨 앞 방의 계산 값인 1을 빼주는 것이다.

이후 nCustomernRow로 나눈 값의 나머지가 층 수이기 때문에 남은 값만큼 nFloor값을 증가시켜 준다.
이 때 만약 nCustomernRow로 나눈 나머지가 0이 된다면 맨 꼭대기 층에 있다는 것을 의미하므로 nFloornRow값을 넣어준다.

계산이 완료 된 후, 층수는 백의 자리이기 때문에 nFloor를 100배로 증가시키고 nFloornWindow를 더한 값을 출력한다.

코드

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);
		}
	}
}