文系プログラマーのプログラミング備忘録

Java、競プロ、数学などについて書いてます

「,(カンマ)」 [yukicoder No.784]

yukicoder.me


与えられた数字にカンマを入れる、というシンプルな問題です。

//

import java.util.*;

class Main {
	static Scanner sc = new Scanner(System.in);
	public static void main(String[] args) {

		StringBuilder sb = new StringBuilder(sc.next());
		int length = sb.length();
		for (int i=length-1; i>=1; i--) {
				if ((length-i)%3==0) sb.insert(i,",");
		}
		
		System.out.println(sb);
		
	}
}


シンプルな問題といいつつ、実装に少し苦労しました。


StringBuilder の insert でカンマを挿入していきます。insert で指定する位置は、先頭の文字の直前が0、末尾の文字の直後が (文字列の長さ) となっていて、少し複雑です。表にしてみます。


f:id:YukiMoto:20190212175921j:plain


表の通り、charAt(0) と insert(0) が参照する位置は同じではありません。挿入は文字と文字の間におこなわれるので、こういった位置になっているんですね。ちなみに substring も insert と同じ参照位置です。表の文字列で substring(1,4) とすると、bcdが取得されます。


今回書いたプログラムは、先頭と末尾を除いた挿入位置を後ろからみていって、(文字列長 - 挿入位置の番号) が3の倍数であればカンマを挿入する、という処理になっています。




※補足:String.format() を使うことで、驚くほど簡単に記述できるみたいです。

import java.util.*;

class Main {
	static Scanner sc = new Scanner(System.in);
	public static void main(String[] args) {
		
		System.out.println(String.format("%,d", sc.nextInt()));
		
	}
}


この書き方は覚えておきたいですね。