Cafe Binary Notation
[백준 알고리즘 11718번] 그대로 출력하기 (자바) 본문
단계별로 풀기: 1단계-7
문제:
입력 받은 대로 출력하는 프로그램을 작성하시오.
입력:
입력이 주어진다. 입력은 최대 100줄로 이루어져 있고, 알파벳 소문자, 대문자, 공백, 숫자로만 이루어져 있다. 각 줄은 100글자를 넘지 않으며, 빈 줄은 주어지지 않는다. 또, 각 줄은 공백으로 시작하지 않고, 공백으로 끝나지 않는다.
+입력이 끝났을 경우(엔터만 쳤거나, 위 조건을 벗어난 경우) 여태까지 입력한 모든 문자열을 출력한다 !! (젤중요한 조건이 왜 안써있지)
출력:
입력받은 그대로 출력한다.
나의 답안:
첫번째
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import java.util.*; public class Main { public static void main(String[] args){ Scanner scan = new Scanner(System.in); for(int i=0; i<100; i++) { String word = scan.nextLine(); System.out.println(word); } } } | cs |
-> [런타임 오류 발생]
문제에서 주어진 조건을 전혀 반영하지 않고, 그냥 100번 입력받는것만 생각했음
정신차리고 두번째
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | import java.util.*; public class Main { public static void main(String[] args){ Scanner scan = new Scanner(System.in); while(scan.hasNextLine()) { for(int i=0; i<100; i++) { String word = scan.nextLine(); if(word.startsWith(" ") || word.endsWith(" ") || word.length()>100 || word.isEmpty()) { System.out.println("다시 입력해주세요"); }else{ System.out.println(word); } } }scan.close(); } } | cs |
-> [런타임 오류 발생]
일단 nextline()으로 입력을 받기 위해서는 다음 줄이 있는지 확인을 해야한다고 하길래 hasNextLine()을 써넣었다.(이때까지 뭔소린지도 모르고 씀)
지금보니 break없는 while문이다 ㅋㅋㅋㅋㅋ 모르긴 몰라도 오지게 몰랐나보당
일단 문제에서 원하는 조건 추가.
각 줄은 100글자를 넘지 않으며: word.length() > 100
빈 줄은 주어지지 않는다: word.isEmpty()
각 줄은 공백으로 시작하지 않고: word.startsWith(" ")
공백으로 끝나지 않는다: word.endsWith(" ")
그런데 자꾸 에러.. 엉엉
세번째 정답!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import java.util.*; public class Main { public static void main(String[] args) { Scanner scan= new Scanner(System.in); ArrayList<String> words = new ArrayList<>(); while (scan.hasNextLine()) { String word = scan.nextLine(); if (word.startsWith(" ") || word.endsWith(" ") || word.length()>100 || word.isEmpty()) { break; } words.add(word); } scan.close(); for (int i = 0; i < words.size(); i++) { System.out.println(words.get(i)); } } } | cs |
-> 다른사람의 풀이를 참고해서 겨우맞췄다.. 문제에서 가장 중요한 조건(입력이 끝났을 경우(엔터만 쳤거나, 위 조건을 벗어난 경우) 여태까지 입력한 모든 문자열을 출력한다) 이 없었기 때문에 이렇게 코드를 짜지 못한 것이라고 위로해보며...
**처음에 Scanner scan = new Scanner(System.in) 하고 바로 while(scan.hasNextLine()) 조건에서 scan.hasNextLine()이 true가 되는 이유는??
Scanner scan = new Scanner(System.in)을 하는 행위 자체가 커서를 깜빡거리면서 입력을 기다리게끔 하기때문에, 행이 있다고 판단하고 true가 되는 걸로 일단 이해를 했다.
★입력이 끝났을 때를 어떻게 판단할 것인가?
abababa
l <- 커서 깜빡깜빡
Scanner의 nextLine()메소드를 이용하여 줄단위 입력을 받았을 때, \n(다음줄)이 buffer에 남아있게 된다.
따라서 더이상 입력받을 줄이 없을 때 NoSuchElementException에러가 나기 때문에 hasNextLine()을 이용하여 입력 완료 여부를 검사해야 한다.
--> 이 말인 즉슨,
nextLine()으로 입력을 받으면 다음줄에서 깜빡깜빡 하고있는데 사실 입력된건 없음 --> NoSuchElementException 발생,
hasNextLine()은 문자열로 구성된 한 줄이 있는지를 검사해주기 때문에 (\n만 남아있으면 false 리턴) 다음줄을 입력받았는지 아닌지를 알 수 있는 것이다.
**hasNextLine()은 다음 줄에 입력이 있는지 여부를 판단해 boolean형식으로 반환해주는 메소드이다. 입력이 있으면 true를 반환한다.
주의할 점은, 입력이 계속 없으면 기다렸다가 false를 반환하는것이 아니라 입력이 있을 때까지 기다렸다가 true를 반환하기때문에 빠져나오기 위해서는 break를 사용해야 한다 !!
이해를 위해 연습한 자바 Scanner클래스의 next(), nextLine(), hasNextLine()의 차이
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import java.util.*; public class Main { public static void main(String[] args){ Scanner scan = new Scanner("안녕안녕 반가워 \n 헤헤헤헤\n"); System.out.println(scan.next()); System.out.println(scan.nextLine()); System.out.println(scan.hasNextLine()); System.out.println(scan.nextLine()); System.out.println(scan.hasNextLine()); } } | cs |
★여태까지 입력한 모든 문자열 출력
빈 배열을 만들어서 조건에 맞는 것은 쇽쇽 add해줬다가 나중에 배열 내부의 값을 모두 출력하는 방식 !
hasNextLine()의 개념이 아직도 아리송하다.
시간을 두고 조금 더 생각해 봐야지
맨날 println 시키다가 갑자기 이런거 내면 어떡해요
@_@
'Java > 알고리즘' 카테고리의 다른 글
[백준 알고리즘 10998번] A*B (자바) (0) | 2018.02.06 |
---|---|
[백준 알고리즘 11719번] 그대로 출력하기2 (자바) (4) | 2018.02.06 |
[백준 알고리즘 10718번] We love kriii (자바) (2) | 2018.02.05 |
[백준 알고리즘 10172번] 개 (자바) (2) | 2018.02.05 |
[백준 알고리즘 7287번] 등록 (자바) (2) | 2018.02.04 |