while문은 for문과 다르게 범위가 따로 주어지지 않기 때문에 무한루프가 다르다는 점을 갖고 있습니다.
오늘 제가 배운 내용은,
- while문의 기본
- 무한루프 탈출의 break
- EOF error 해결을 위한 try except 문
가 주요 내용입니다.
10952: A+B - 5
# 10952: A+B - 5
## 첫 풀이, 0을 출력하게 코드를 짜서 틀림.
import sys
while True :
A, B = map(int, sys.stdin.readline().split())
print(A + B)
if A == 0 and B == 0 :
break
## 0을 출력해서 틀렸던거임.
import sys
while True :
A, B = map(int, sys.stdin.readline().split())
if A == 0 and B == 0 :
break
print(A + B)
첫 풀이와 마지막 풀이를 보시면 출력하는 print() 위치가 다른 것을 볼 수 있습니다. 0 0 을 입력하면 루프가 종료고 따로 출력하지않으니 밑에 것이 정답이라고 할 수 있습니다.
10951: A+B - 4
# 10951: A+B - 4, EOF Error -> try except
while True:
try:
A, B = map(int, input().split())
except :
break
print(A + B)
문제에서 "입력이 끝날 때까지 A+B를 출력하는 문제. EOF에 대해 알아 보세요." 라는 내용이 있네요.
try except 문은 예외 처리 (예외적으로 오류를 처리할 수 있음.)
백준 문제 풀 때 EOF Error가 나올 때가 있는데 테스트케이스만 존재하고 끝을 알리는 입력값이 존재하지 않습니다. 위 10952번 같은 경우 0 0 을 통해 루프를 끝낼 수 있지만, 이 문제에서는 그런 값이 없습니다.
따라서 try 중 오류가 발생하여 except로 넘어가게되고 여기서 예외처리를합니다. 그리고 루프를 종료하는 방식으로 문제를 풀었습니다.
1110: 더하기 사이클
# 1110: 더하기 사이클
N = int(input())
first_value = N
count = 0 # 사이클 수
while True :
if N < 10 :
tens = 0
units = N % 10
N = (10*units) + (tens+units)
count += 1
else :
tens = N // 10
units = N % 10
N = (10*units) + (tens+units)
count += 1
if N == first_value :
break
print(count) # 108만 나옴
# 다시풀기
N = int(input())
first_value = N
count = 0 # 사이클 수
while True :
if N >= 10 :
tens = N // 10
units = N % 10
N = (10 * units) + ((tens + units) % 10) # 십의자리 + 일의자리 값이 두자리수로 반환될 수 있기 때문에 '값 % 10' 을 넣어줬음
count += 1
else :
tens = 0
units = N % 10
N = (10 * units) + ((tens + units) % 10)
count += 1
if N == first_value :
break
print(count)
'다시풀기'가 답안입니다.
문제를 풀어서 접근해보겠습니다.
N = 26
2 (십의 자리) + 6 (일의 자리) = 8 → 일의자리 값이 십의자리로, 더한 결과 값이 일의 자리로(만약 결과값이 두자리 숫자라면 일의자리로)
따라서 68이 나옵니다.
N = 68
- 일의 자리인 '8'이 십의 자리로
- 더한 결과 값이 일의 자리로 (결과값이 두자리 숫자이므로 일의자리숫자만 기입)
6 (십의 자리) + 8 (일의 자리) = 14 → 84
여기서 한 숫자 N을 십의 자리와 일의 자리로 각각 출력하는 방법은,
(1) N // 10
(2) N % 10
그리고 알고리즘을 거친 다음 N 숫자는
새 N 값 = { 10 X (이전 N의 일의 자리 숫자) } + { (이전 N의 십의자리 숫자+ 이전 N의 일의 자리 숫자) % 10 }
위 틀린 문제 풀이는 새 N 의 일의 자리 값을 결정하는 과정에서 두 자리 숫자가 출력 되었음에도 10으로 다시 한번 나눠서 나머지 출력인 `% 10`을 해주지 않아 잘못된 풀이.
''' if (조건) :
break '''
을 통해 while 루핑을 빠져나올 수 있게 설정했습니다.
'매일매일 (Everyday)' 카테고리의 다른 글
[BOJ] - 1차원 배열 단계-(2) - Python (0) | 2021.11.29 |
---|---|
[BOJ] - 1차원 배열 단계-(1) - Python (0) | 2021.11.26 |
[BOJ] - for문 - Python (0) | 2021.11.24 |
[BOJ] - if문 - Python (0) | 2021.11.23 |
[BOJ] - 입출력과 사칙연산 - Python (0) | 2021.11.22 |