일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
27 | 28 | 29 | 30 | 31 |
- github api
- 통계대학원
- 안드로이드 플랫폼
- Android 컴파일
- okHttp
- LRU
- 웹 크롤링
- TabLayout
- Android
- Clean Architecture
- AndroidX
- TODO
- 셀레니움
- 백준 15686
- 필답고사
- RETROFIT
- Kotiln
- 데이터바인딩
- 안드로이드 API
- ViewPager2
- 수리통계
- ViewModel
- REST API
- RecyclerView
- gson
- kotlin
- python3
- Devexpress
- Java
- FragmentStateAdapter
- Today
- Total
그냥 가끔의 기록장
백준 10951, 10952 본문
백준 단계별 문제 풀기 while문의 첫 번째, 두 번째 문제이다. 비슷한 유형이기에 묶어서 풀이하고자 한다.
백준 10952 문제
문제 풀이
핵심은 0 0이 입력될 때까지 반복해서 두 수의 합을 출력하는 문제이다.
문제가 while문에 있으니 알겠지만 보통 반복 횟수를 처음부터 알기 힘든 경우 while 문으로 푸는게 일반적이다.
<잠깐, do-while문과 while문의 차이>
do{} while() 문은 {}안에 있는 명령문을 먼저 수행 한 후 while문의 ()조건을 확인한다. ()을 만족할 경우 {}의 명령문을 반복하여 수행하고 ()를 만족하지 않으면 빠져나간다.
while문과 다른 점을 고르자면
while문은 while() {} 으로 구성되어 ()의 조건을 먼저 확인 한 후, 조건이 참일 경우에 {}의 명령문을 수행한다.
즉, while문은 ()의 조건문이 거짓일 경우 명령문이 한 번도 수행되지 않지만 do-while문은 {} 명령문을 적어도 1번 실행한다. (조건이 거짓이라도 명령문을 먼저 수행 한 후 조건의 참, 거짓을 확인하므로)
(굳이 do-while문을 쓸 필요는 없지만 그냥 while, do-while 두 가지 전부 작성해 보았다. 둘 다 로직은 동일)
1) do-while문
a와 b는 0보다 크다는 조건이 있으므로 가장 처음의 입력부터 0 0을 입력하지 않는다는 가정하에 do-while문을 사용하였다.
가장 먼저 a와 b를 입력받기 위해 scanf를 작성한다.
scanf("%d %d", &a, &b);
이때 a와 b가 둘다 0이라면 프로그램을 종료해야하므로 while문을 빠져나가기 위해 break한다.
if( a==0 && b==0){
break;
}
a와 b가 둘다 0이 아니라면 둘의 합을 출력한다.
printf("%d\n", a+b);
저 위의 세 명령문은 0 0이 입력되기 전까지 반복되어야 한다.
다시 말해, a가 0이 아니고 b가 0이 아닐 동안 반복된다.
고로 조건은 a!=0 && b!=0이 된다.
전체 코드는 아래와 같다.
2) while문
while문도 로직은 동일한다. 허나 do-while문보다 더 간단한데, while의 조건에 1을 넣어 무한루프로 만들고 0 0 입력시 break로 루프를 멈추면 된다.
(c언어에서 1은 true, 0은 false와 같다.)
전체 코드는 아래와 같다.
백준 10951 문제
문제 풀이
아까 10952문제와 동일하지만 while문을 끝낼 조건이 다르다. 10952에서는 while문을 0 0 입력시 종료했다면, 여기선 별도로 while문을 끝낼 조건을 주지 않았다.
(그렇다고 while문을 종료시키지 않으면 프로그램을 정상적으로 종료시킬 수 없으므로 그냥 냅두면 안된다.
+ 그냥 냅둘경우 백준에서 "출력 초과"가 뜬다. 프로그램이 무한루프에 빠졌다는 뜻)
한마디로 테스트 케이스 개수를 모르는 경우인데, 이럴땐 EOF까지 입력을 받고 종료시키면 된다.
EOF란, End of FIile로 파일의 끝을 의미한다. 더 이상 읽어올 데이터가 없다는 것을 알려주어 프로그램을 정상적으로 종료시켜주고자 매크로로 정의된 EOF값을 리턴해주는 것이다.
10952에선 while(1)을 조건으로 두었다면, 이번 문제에서는 while(scanf("%d %d", &a, &b) !=EOF)로 조건을 둔다.
EOF가 아닐동안 입력을 계속 받겠다는 뜻...
전체 코드는 아래와 같다.
'기타 개발 > 백준 문제풀이' 카테고리의 다른 글
백준 10809 (0) | 2020.03.03 |
---|---|
백준 1110 (0) | 2020.03.03 |
백준 10871 (0) | 2020.03.03 |
백준 2438, 2439 (0) | 2020.02.26 |
백준 11021, 백준 11022 (0) | 2020.02.26 |