[白俊]10250号:ACMホテル-Java(Java)



今回の質問はお客様に部屋を手配する問題です.条件としては全室1格1で、お客様は近い部屋が好きです.エレベーターで他の階に行くこともできますが、エレベーターは街に含まれていません.そして、同じ距離なら少し低い階が好きです.入力値はH(フロア)W(1階あたりの部屋数)、N(N番目のお客様)です.

Step 0. 解答コード

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class AMC_Hotel_10250 {
	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

	public static void check_in(int H, int W, int N) throws IOException {
		String Y; // 층 수
		String X; // 엘리베이터로부터 몇 번째 칸인가?
		if (N % H == 0) {
			Y = Integer.toString(H);
			X = String.format("%02d", (N / H));
		} else {
			Y = Integer.toString(N % H);
			X = String.format("%02d", (N / H) + 1);
		}
		System.out.println(Integer.parseInt(Y + X));

	}

	public static void main(String[] args) throws IOException {
		int T = Integer.parseInt(br.readLine()); // 테스트 개수
		int[] hotel = new int[T * 3];
		int count = 0;
		for (int i = 0; i < T; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine(), " ");
			int st_count = st.countTokens();
			for (int j = 0; j < st_count; j++) {
				hotel[count] = Integer.parseInt(st.nextToken());
				count++;
			}
		}
		count = 0;
		for (int i = 0; i < T; i++) {
			check_in(hotel[count], hotel[count + 1], hotel[count + 2]);
			count += 3;
		}

	}

}

解答コードバージョン2

package Basic_Math;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;


public class AMC_Hotel_10250_2 {
	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	public static void check_in() throws IOException{
		
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		
		int H = Integer.parseInt(st.nextToken()); // 층 수
		int W = Integer.parseInt(st.nextToken()); // 각 층의 방 수
		int N = Integer.parseInt(st.nextToken()); // 몇 번째 손님인가
		String Y; //층 수
		String X; //엘리베이터로부터 몇 번째 칸인가?
		if(N % H == 0) {
			Y = Integer.toString(H);
			X = String.format("%02d",(N / H));
		}
		else {
			Y = Integer.toString(N % H); 
			X = String.format("%02d",(N / H) + 1);
		}
		System.out.println(Y + X); 
		
	}
	public static void main(String[] args) throws IOException{
		int T = Integer.parseInt(br.readLine()); //테스트 개수
		int count = 0;
		for (int i = 0; i < T; i++) {
		check_in();
		count += 3;
		}
		
		
		
	}

}
答えコード1と2の違いは、1繰り返し回数を入力した後、H、W、Nの値を一度に配列に保存し、配列から値を取り出して出力することです.このようにするのは,これらの値を同時に入力と出力値を同時に出力させることが問題の目的であるが,第2の方法のように,入力>出力>入力>出力の順に入力しても問題ないことが分かったので,第2の方法も書いた.2つ目は、最後にStringの形式でこれらの値を教えます.最初にint型をあげると思ったけどString型も正解だった説明では、最初のコードを使用して説明します.

Step 1. 質問へのアクセス


問題の説明の通り、各部屋の番号はYXX形式で生成されます.Yはフロア、Xは各階エレベーターの距離です.XとYの値を見つければ正解が見つかりますそのため、N番目のお客様/H(高さ)を作り、そのお客様がエレベーターから何階離れているかを求め、N%Hを通って残りの値を何階か求めました.

Step 2. 問題を解く


今回はBufferedReaderクラスも使用しました.
計算を管理するために
  • check inメソッドを作成しました.
  • public static void check_in(int H, int W, int N) throws IOException {
    throws IOExceptionセクションではBufferedReaderクラスは使用されていないため、使用する必要はありませんが、他のクラスで使用されている場合は、例外処理が必要であることを確認するために消去されません.解答コード2では,check inメソッドに対してBufferedReaderクラスを用いて例外処理を行う必要がある.
  • 我々が要求するX,Y値を見つけるために,まずN%Hが0であるかどうかを決定する.残りは0という意味で分かれているという意味で、そのセルの最上位の意味です.しかし、数字は0と表示されているので、私たちは単独で管理しています.
  • 		String Y; // 층 수
    		String X; // 엘리베이터로부터 몇 번째 칸인가?
    		if (N % H == 0) {
    			Y = Integer.toString(H);
    			X = String.format("%02d", (N / H));
    		} else {
    			Y = Integer.toString(N % H);
    			X = String.format("%02d", (N / H) + 1);
    		}
    		System.out.println(Integer.parseInt(Y + X));
    次にN/HやN%Hなどを用いてX,Y値を求める.(N/H)+1に+1を加えたのは、N/H値が0の場合、エレベーターは次の部屋、つまりYY 1号になるので、分ごとに+1を加えます.またStringformatメソッドを使用して0 x形状で文字を抽出します.また、変数を受信すると、BufferedReaderクラスはString形式で受信され、私が望む形状に変換され続けます.最後のシステムを参考にします.out.println(Integer.parseInt(Y + X)); で、int型に変換しなくても文字型に出力できますが、バックグラウンドでは正しいことがわかります.
  • メソッドが完了し、テスト個数Tを入力し、対応する回数で解式を作成しました.
  • public static void main(String[] args) throws IOException {
    		int T = Integer.parseInt(br.readLine()); // 테스트 개수
    		int[] hotel = new int[T * 3];
    		int count = 0;
    		for (int i = 0; i < T; i++) {
    			StringTokenizer st = new StringTokenizer(br.readLine(), " ");
    			int st_count = st.countTokens();
    			for (int j = 0; j < st_count; j++) {
    				hotel[count] = Integer.parseInt(st.nextToken());
    				count++;
    			}
    		}
    		count = 0;
    		for (int i = 0; i < T; i++) {
    			check_in(hotel[count], hotel[count + 1], hotel[count + 2]);
    			count += 3;
    		}
    Main MoonでTを受信して使用し,hotel配列で一度に入力値を受信して保存して使用した.count値を求めて配列に3つの値を格納します.ただし,すべての入力>1回の計算を一度に処理するのではなく,1回の出力順序ではなく,解答コード2回のように,入力Tを繰り返す回数>計算後処理>入力>計算後処理である.一度繰り返しても,バックグラウンドで正しい答え処理が行われていることが分かる.最後のcheck inメソッドを読み込むと出力値が印刷されます.

    Step 3. に感銘を与える


    BufferedReaderクラスまたはStringTokenizerクラスの使用をより熟知し、関連する方法を学びました.これは以前よりもfor文の使用に慣れた良い時間です.そして白俊の正解処理システムも一気に理解できる時間!
    出典:百駿10250号https://www.acmicpc.net/problem/10250