paizaのレベルアップ問題集にこのような問題がある。
タイトル通り、N行のデータが入力されるから全部出力しろという問題だ。
N行のデータの入力 (paizaランク D 相当)
自分の回答
import java.util.*;
public class Main {
public static void main(String[] args) {
// 自分の得意な言語で
// Let's チャレンジ!!
Scanner scan = new Scanner(System.in);
int line = scan.nextInt();
for(int i = 1; i <= line; i++){
String ans = scan.nextLine();
System.out.println(ans);
}
}
}
入力(そのまま出力したいコード)
aaaaa
bbbbbb
cccc
実際の出力(不正解)
aaaaa
bbbbbb
このように、謎の改行が入ってしまった。それと最後の行が出力されていない。
なお、最後の行云々に関しては、for文の箇所を for(int i = 1; i <= line + 1; i++)にすれば解決する。……が、空行が出力されてしまう点に変わりは無い為、根本的な解決策ではない。
なので以下の解決方法を備忘録として記しておく。探せばもっと効率のいい方法が出てくるとは思うが、気にしないことにする。
解決方法1: nextInt() の後に nextLine() を1回呼び出して改行を消費する
import java.util.*;
public class Main {
public static void main(String[] args) {
// 自分の得意な言語で
// Let's チャレンジ!!
Scanner scan = new Scanner(System.in);
int line = scan.nextInt();
scan.nextLine();//これをいれると空行がなくなる
for(int i = 1; i <= line; i++){
String ans = scan.nextLine();
System.out.println(ans);
}
}
}
解決方法2: 最初から nextLine() を使用して数値を文字列として読み込み、それを整数に変換する
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int line = Integer.parseInt(scan.nextLine()); // nextLine()で読み込んでから整数に変換
for(int i = 0; i < line; i++){ // iの開始を1から0に変更
String ans = scan.nextLine();
System.out.println(ans);
}
}
}
解決方法3: while ループを使って読み込む
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int line = Integer.parseInt(scan.nextLine()); // nextLine()で読み込んでから整数に変換
int count = 0;
while (count < line) {
String ans = scan.nextLine();
System.out.println(ans);
count++;
}
}
}
上にあげた3つの方法で出力したコード(正解)
aaaaa
bbbbbb
cccc