본문 바로가기
Programming/Python

[BAEKJOON] 백준 Python 3단계 반복문 10952번 / 10951번 / 1110번 / A+B -5 / A+B -4 / 더하기 사이클

by EunjiBest 2022. 4. 13.

[BAEKJOON] 백준 Python 3단계 반복문 10952번 / 10951번 / 1110번 / A+B -5 / A+B -4 / 더하기 사이클

 

 

 

 

10952번(A+B -5)

 

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

입력 : 입력은 여러 개의 테스트 케이스로 이루어져 있다.
각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)
입력의 마지막에는 0 두 개가 들어온다.

출력 : 각 테스트 케이스마다 A+B를 출력한다.

 

A+B문제는 언제 끝이 나는걸까.

 

드디어 for가 아닌 while을 사용할 때가 왔나보다.

 

while은 조건문이 참인 경우 반복을 진행하고, 거짓인 경우 반복문을 빠져나온다.

이를 활용하여 식을 정리해보자면.

 

1. while의 조건을 True로 만들어준다.

2. A,B를 input()으로 받아준다.

3. if문을 이용하여 A와 B가 0일경우

4. while을 멈춘다.

5. A+B를 출력한다.

 

while True:
  A,B = map(int, input().split())
  if A == 0 and B == 0:
    break
  print(A+B)

 

 

 

 

10951번 (A+B -4)

 

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

입력 :입력은 여러 개의 테스트 케이스로 이루어져 있다.
각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)
출력 : 각 테스트 케이스마다 A+B를 출력한다.

 

위 문제에서 0 조건이 없는 문제인 것같다.

그렇다고 무작정

if A == 0 and B == 0:

if문을 빼버린다면? 무한으로 돌아간다.

무언가 중단을 해줄 수 있는 장치가 필요하다.

 

근데 나는 어떻게 멈춰야하는지 모르기 때문에

구글링을 해보니!

try와 expect라는 개념이 있는 것같다.

 

문법은

 

try:
    ...
except 발생 오류:
    ...

 

이렇게 사용한다.

try 블록 수행 중 오류가 발생하면 except 블록이 수행된다.

하지만 try 블록에서 오류가 발생하지 않는다면 except 블록은 수행되지 않는다.

 

이걸 활용하여 if문대신 while문에 넣어보겠다.

 

while True:
  try:
    A,B = map(int, input().split())
    print(A+B)
  except:
    break

 

왜 이 문법을 몰랐는지는 모르겠지만앞으로 알았으니 잘 써먹도록 하겠다.

 

 

 

1110번(더하기 사이클)

 

0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음, 주어진 수의 가장 오른쪽 자리 수와 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙이면 새로운 수를 만들 수 있다. 다음 예를 보자.
26부터 시작한다. 2+6 = 8이다. 새로운 수는 68이다. 6+8 = 14이다. 새로운 수는 84이다. 8+4 = 12이다.
새로운 수는 42이다. 4+2 = 6이다. 새로운 수는 26이다.
위의 예는 4번만에 원래 수로 돌아올 수 있다.
따라서 26의 사이클의 길이는 4이다.
N이 주어졌을 때, N의 사이클의 길이를 구하는 프로그램을 작성하시오.

입력 : 첫째 줄에 N이 주어진다. N은 0보다 크거나 같고, 99보다 작거나 같은 정수이다.

출력 : 첫째 줄에 N의 사이클 길이를 출력한다.

 

반복문 마지막 문제답게 매우 길다.

차근히 문제를 뜯어보자ㅎㅎ

 

1. N을 input한다.

2. 만약 N이 10보다 작으면 -> 앞에 0을 붙여 두자리수 만들기

3. N의 각 자리수 더하기

4. N의 가장 오른쪽 자리 수와 3번에서 더한 값의 가장 오른쪽 자리수 이어붙이기.

5. 4번의 수와 N이 같을 때까지 무한반복

6. 위 계산이 돌아간 사이클 수 출력.

 

그럼 이걸 어떻게 코드로 변환하면 될까..?

 

list들 사용하여 수를 쪼개려고했는데

지금까지 문제를 풀어본 결과, str로 출력으하면 시간초과 오류가 뜨길래

int 형식으로 받기로 했다.

 

N1 = N % 10 #Y일의자리
N2 = N // 10 #Y십의자리
X = N1 + N2
X1 = X % 10 #X 일의자리
X2 = X // 10 #X 십의자리
New = (N1*10) + X1 #새로운 수

 

먼저 필요한 수들을 다 쪼개보았다.

만약 N을 input으로 28 이라는 숫자를 받았을 때

N의 일의자리 수는 28을 10으로 나눈 나머지 즉, 8이다.

N의 십의자리 수는 28을 10으로 나는 몫, 즉 2이다.

 

이렇게

N과 X의 값을 모두 쪼개주어

새로운 수(New)를 만들었다.

 

이제 이 계산을 while문에 돌려주면 된다.

 

N = int(input())
num = N
count = 0

while True:
  N1 = num % 10 #Y일의자리
  N2 = num // 10 #Y십의자리
  X = N1 + N2
  X1 = X % 10 #X 일의자리
  X2 = X // 10 #X 십의자리
  New = (N1*10) + X1 #새로운 수

  count += 1
  if New == N:
    break
  num = New
print(count)

 

count += 1로 반복문의 횟수를 카운팅해주고,

New와 N이 똑같다면 반복문을 멈춘다.

그리고 num에 New를 갱신해주면

 

완료!

 

마지막까지 num을 New를 갱신해 주어야하는 것을

빼먹어서 무한루프속에서 빠져나오지 못했다..

저 한 줄이 내 한시간을 뺏어가버렸따ㅠㅠㅠㅠ

 

다음부터는 저런 실수를 하지않도록..!ㅎ

 

이렇게해서

반복문의 모든 문제를 풀어보았다.

 

내일부터는 4단계 1차원 배열 문제를 풀어보도록 하겠다.!

 

 

 

 

 

 

반응형

댓글