본문 바로가기

매일매일 (Everyday)

[BOJ] - while문 - Python

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 루핑을 빠져나올 수 있게 설정했습니다.