[백준-Java] 기본 수학 1 (#10250, #2775)

RedPanda·2021년 9월 13일
0

[알고리즘] Java

목록 보기
12/16

백준은 코드와 설명만 포스팅 할 예정이다.

#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 - 부녀회장이 될테야

이번 문제는 고민을 많이 했다. 이유는 이 조건 때문이었다.

  • a층의 b호에 살려면 자신의 아래(a-1)층의 1호부터 b호까지 사람들의 수의 합만큼 사람들을 데려와 살아야 한다”

바로 계산하기에는 바로 아래층이 몇 명있는지 구할 수가 없었고, 아래층을 구하자니 그 아래층부터 구해야하기 때문에 코드가 복잡해지는게 두려웠다.

고민 끝에 일단 그려봤는데 위의 아파트와 같은 표가 그려졌다...

규칙성을 찾다가 갑자기 '이거 그냥 이중 배열로 만들어놓고 찾으면 될 것 같은데?' 라는 생각이 들었다.

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

        }

    }
}

여담...

풀다가 이렇게 푸는게 맞나 싶어서 찾아봤다.

다행히도 맞았지만 다음부터는 좀 더 생각해서 다 풀고 맞춰봐야겠다.

profile
끄적끄적 코딩일기

0개의 댓글