티스토리 뷰
[백준 단계별/JAVA] 4단계. while문 (+ break, continue, hasNext(), StringTokenizer, charAt() 등)
happii 2021. 12. 24. 01:161. [10952번] A+B -5


※ while문
while문은 for문에 비해 구조가 간단합니다.
if문처럼 조건식과 블럭{}만으로 이루어져 있습니다.
다만 if문과 달리 while문은 조건식이 '참(true)인 동안'
즉 조건식이 거짓이 될 때까지 블럭{}내의 문장을 반복합니다.
while (조건식) {
// 조건식의 연산결과가 참(true)인 동안, 반복될 문장들을 적는다.
}
while문은 먼저 조건식을 평가해서 조건식이 거짓이면 문장 전체를 벗어나고,
참이면 블럭내의 문장을 수행하고
다시 조건식으로 돌아갑니다.
조건식이 거짓이 될 때까지 이 과정이 계속 반복됩니다.
for문과 while문은 항상 서로 변환이 가능하지만,
만일 초기화나 증감식이 필요하지 않은 경우라면
while문이 더 적합할 것입니다.
♨ while문의 조건식은 생략불가!!
while() { // 에러. 조건식이 없음.
...
}
while (true) { // 조건식이 항상 참
... // 블럭 내의 문장을 무한반복
}
for (;;) { // 조건식이 항상 참
...
}
한 가지 주의할 점은 for문과 달리
while문의 조건식은 생략할 수 없습니다.
그래서 while문의 조건식이 항상 참이 되도록 하려면
반드시 true를 넣어야 합니다.
(무한 반복문은 반드시 블럭 안에 조건문을 넣어서
특정 조건을 만족하면 무한 반복문을 벗어나도록 해야합니다.)
♨ break문
break문은 자신이 포함된 가장 가까운 반복문을 벗어납니다.
무한 반복문에는 조건문과 break문이 항상 같이 사용되어
조건문이 참일 경우 break문이 수행되어
자신이 속한 반복문을 즉시 벗어납니다.
그렇지 않으면 무한히 반복되기 때문에 프로그램이 종료되지 않습니다.
♨ continue문
continue문은 반복문 내에서만 사용될 수 있으며
반복이 진행되는 도중에 continue문을 만나면
반복문의 끝으로 이동하여 다음 반복으로 넘어갑니다.
for문의 경우 증감식으로 이동하며
while문과 do-while문의 경우 조건식으로 이동합니다.
continue문은 반복문 전체를 벗어나지 않고
다음 반복을 계속 수행한다는 점이 break문과 다릅니다.
주로 if문과 함께 사용되어 특정 조건을 만족하는 경우에 continue문 이후의 문장들을 수행하지 않고
다음 반복으로 넘어가서 계속 진행합니다.
전체 반복 중에 특정조건을 만족하는 경우를 제외하고자 할 때 유용합니다.
2. [10951번] A+B -4

간단한 문제지만 가장 중요한 점이 파일 종료 조건이 없이 그냥 입력이 주어졌다.
(어디서 입력이 끝날지 모르는데 프로그램 종료를 어떻게 시켜야 하지?)
처음 코드를 제출했을 때는 종료 시점을 몰라 런타임 에러가 발생하였다.
도저히 모르겠어서 검색해본 결과 3가지 방법을 알 수 있었다.
입력의 종료는 더이상 읽을 수 있는 데이터 (EOF; End of File)가 존재하지 않을 때 종료해야 한다.
3가지 풀이.
1. Scanner
2. BufferedReader + StringTokenizer (문자열 분리)
3. BufferedReader + String.charAt()
방법1. Scanner
Scanner 의 메소드들의 경우 더이상 읽을 데이터가 없으면 NoSuchElementException 을 던지게 된다.
자바의 경우 입력값이 들어오느냐 마느냐의 여부를 판단하는
Scanner 클래스의 메소드인 hasNext() 함수를 사용하면 된다고 한다.

Scanner 클래스에 hasNext관련 함수는 위와 같이 있는데,
hasNext 뒤로 Boolean, Double, Int, Float 등등 자료형이 붙은 건 입력된 값이 그 자료형일 경우에는 true를 반환하고,
입력이 없거나 그 자료형이 아닐 경우 바로 예외를 던지며 더이상의 입력을 받지 않고 false를 반환하면서 반복문이 종료된다.

방법2. BufferedReader + StringTokenizer (문자열 분리)
BufferedReader는 저번에 개념을 한 번 해둬서 낯설지 않았다.
Scanner 대신 BufferedReader를 쓰는 방식으로,readLine()을 통해 행 단위로 입력 받기 때문에 공백단위로 입력해준 문자열을 공백단위로 분리해주어야 한다.
우선, StringTokenizer 클래스를 이용하여 분리해주는 방법이다.
출력에서는 StringBuilder 를 쓴다. 참고로 st.nextToken() 은 문자열을 반환하므로 Integer.parseInt()로 int 형으로 변환시켜준다.

방법3. BufferedReader + String.charAt()
StringTokenizer가 성능이 좋다고 하지만 반복문을 할 때마다 객체를 계속 생성해주는게 시간을 잡아먹을 것 같지 않은가?
그러면 굳이 객체생성을 안하고 더욱 쉽고 빠르게 charAt()을 써서 짤 수 있다.
charAt()은 해당 문자의 아스키코드 값을 반환하기 때문에 반드시 우리가 아는 정수 형태로 변경하려면 -48 또는 -'0'을 해주어야 한다.

* 성능 차이
방법3: BufferedReader + String.charAt()
방법2: BufferedReader + StringTokenizer
방법1: Scanner
순서대로 성능이 높다.
3. [1110번] 더하기 사이클


'알고리즘 > 백준' 카테고리의 다른 글
[백준] 1780번: 종이의 개수 (Java) / 분할정복 (0) | 2022.02.19 |
---|---|
[백준] 15683번: 감시 (Java) / DFS (0) | 2022.02.19 |
[백준 단계별/JAVA] 3단계. for문 (+ BufferedReader, BufferedWriter) (0) | 2021.12.23 |
[백준 단계별/JAVA] 2단계. if문 (0) | 2021.12.22 |
[백준 단계별/JAVA] 1단계. 입출력과 사칙연산 (BigDeciaml 등) (0) | 2021.12.21 |
- Total
- Today
- Yesterday