Java初心者の競技プログラミング日記

Dvorak配列でjavaを書いてます

Room Numbers of a Hospital [AOJ0208]

Room Numbers of a Hospital | Aizu Online Judge

いかにも競プロで出題されそうな問題だなと思いました。


import static java.lang.System.*;
import java.util.*;

public class Main {
	static Scanner sc = new Scanner(System.in);

	public static void main(String[] args) {
		
		while(true) {
			int n = sc.nextInt();
			if (n == 0) break;
			
			String s = Integer.toOctalString(n);
			s = s.replace("7","9").replace("6","8").replace("5","7").replace("4","5");
			
			out.println(s);
		}
	}
}

この問題のキモは、新部屋番号が{0,1,2,3,5,7,8,9}のみで構成される8進数(に類するもの)になっているということです。したがって、旧部屋番号を8進数に変換し、結果を上記の8つの数字に対応させていけばよいです。

・4 -> 5
・5 -> 7
・6 -> 8
・7 -> 9

ここで気をつけなければならないことが一つ。

結果を数字の小さい順に変換していった場合、4が5に変換され、5が6に変換され……といったように重複して変換されてしまう可能性があるので、大きい順に変換する必要があります。