[伯俊-Java]基本数学1(#10250,#2775)


白俊はコードと説明しか明らかにしない.
#10250-ACMホテル
これはN番目のお客様の部屋番号の問題です.
Hがフロア、Wが部屋数と仮定して、総(H*W)部屋があるホテルです.
お客様への部屋番号の条件は以下の通りです.
  • ホテルの正門から歩く距離を最短にするために、部屋を手配するプログラムを作成したいです.
  • エレベーターが一番左にあるとします.
  • ホテル正門は1階エレベーターの真ん前にあり、正門からエレベーターまでの距離は無視されています.
  • 以上の条件から101番201番301番を見ると...601番102番...このように先に1階を渡ります.
    フロアは(N%H)ですが、H位のお客様の場合はH%H=0なので、1席目は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]);
    
            }
    
        }
    }
    
    雑談.
    私が解こうと思った時にこのように解けるのが正しいので探してみました
    幸いなことに、正しいですが、今度はもう一度考えて、全部解いてから当てなければなりません.