백준은 코드와 설명만 포스팅 할 예정이다.
#10250 - ACM 호텔
N번째 손님의 방번호를 구하는 문제이다.
H를 층, W를 방 개수라 가정하여 총 (H*W)개의 방이 있는 호텔이다.
손님의 방번호를 매기는 조건은 다음과 같다.
위 조건으로 보았을때, 101호, 201호, 301호...601호, 102호...와 같은 식으로 층 먼저 넘어가도록 한다.
층수는 (N%H)이지만 H번째 손님일때는 H%H = 0이므로 첫자리가 0이 된다. 따라서 0 일때는 H값이 되도록 조건을 달아주었다.
호실 번호는 (N/H+1)이다. N/H는 채워진 라인 수이기 때문에 +1을 해주었다.
층 수 때와 같이 손님이 마지막 층에 배정받을 때 N/H는 호실 번호가 나오기 때문에 N%H가 0일때 N/H의 값을 주도록 한다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int test_num = Integer.parseInt(br.readLine());
for(int i = 0 ; i < test_num; i++){
String customer = br.readLine();
String[] HWN = customer.split(" ");
int H = Integer.parseInt(HWN[0]);
int W = Integer.parseInt(HWN[1]);
int N = Integer.parseInt(HWN[2]);
if(N > H*W) { // 예외 처리(방의 개수를 넘어갔을 때)
System.out.println("잘못된 입력입니다.");
break;
}
int floor = N%H;
int room = N/H+1;
if(floor == 0) { // 마지막 층에서의 예외처리
floor = H;
room = N / H;
}
String result = String.format("%d%02d",floor, room); // 방번호의 뒷자리는 2자리이므로 포멧팅
System.out.println(result);
}
}
}
#2775 - 부녀회장이 될테야
이번 문제는 고민을 많이 했다. 이유는 이 조건 때문이었다.
바로 계산하기에는 바로 아래층이 몇 명있는지 구할 수가 없었고, 아래층을 구하자니 그 아래층부터 구해야하기 때문에 코드가 복잡해지는게 두려웠다.
고민 끝에 일단 그려봤는데 위의 아파트와 같은 표가 그려졌다...
규칙성을 찾다가 갑자기 '이거 그냥 이중 배열로 만들어놓고 찾으면 될 것 같은데?' 라는 생각이 들었다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
int[][] arr = new int[15][15];
int j, i, k ,n;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int test_num = Integer.parseInt(br.readLine());
for(j = 0; j < 15; j++){
arr[j][1] = 1;
arr[0][j] = j;
} // 초기화(1호실은 모두 1명, 1층은 모두 호실 번호만큼의 인원이 배정되어 있음.)
for(j = 1; j < 15; j++){
for(i = 2; i < 15; i++){ // 정해진 값을 제외하고 이중 반복
arr[j][i] = arr[j-1][i] + arr[j][i-1];
} // 밑의 층과 옆호실을 더하여 호실을 구함(ex. 1층 3호실 = 1층 2호실 + 0층 3호실)
}
for(i = 0; i < test_num; i++){
k = Integer.parseInt(br.readLine());
n = Integer.parseInt(br.readLine());
System.out.println(arr[k][n]);
}
}
}
여담...
풀다가 이렇게 푸는게 맞나 싶어서 찾아봤다.
다행히도 맞았지만 다음부터는 좀 더 생각해서 다 풀고 맞춰봐야겠다.