본문 바로가기
코딩테스트/백준 알고리즘

백준 알고리즘 | 1110번 : 더하기 사이클 (Python / 파이썬)

by 함께 공부해요 2020. 9. 12.


더하기 사이클 성공분류

시간 제한

메모리 제한

제출

정답

맞은 사람

정답 비율

2 초

128 MB

85750

40664

34602

48.295%

www.acmicpc.net/problem/1110

 

1110번: 더하기 사이클

0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음,

www.acmicpc.net


문제

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의 사이클 길이를 출력한다.


백준 알고리즘 # 1110번 : 더하기 사이클 (int)

n = int(input())         # 68
num = n
cnt = 0                  # 사이클 수

while True:              # while 1이랑 동일
    a = num / / 10       # 6
    b = num % 10         # 8
    c = (a + b) % 10     # 6 + 8 = 1"4"
    num = (b * 10) + c   # 80 + 4 = 84

    cnt = cnt + 1        # 사이클 수 + 1
    if(num == n):        # num에서 입력된 n과 똑같은 숫자(68)가 나오면 멈춤
        break

print(cnt)

풀이

저는 1110번을 정수(int)로 풀이하는 방법문자열(str)로 풀이하는 방법, 2가지로 나누어서 풀이해보았는데요😮

먼저 정수(int)로 풀이하는 방법은 산수로 풀이하신다고 생각하시면 됩니다.

문제에 주어진 새로운 수 68을 예로 들면

n에 68이 input()으로 입력되고, num = n으로 변수를 하나 설정해줍니다.

다음으로 새로운 수가 만들어지는 사이클을 cnt(count) = 0으로 설정합니다.

그리고 while 문을 사용해서 True(참)인 동안 계속 반복문이 돌아가게끔 했는데요

while 1: 로 코드를 사용해도 상관 없습니다.

이제부터 중요한 부분인데요, 제가 작성한 산술 연산자 표를 보면서 설명드릴게요.

연산자

의미

+

덧셈

-

뺄셈

*

곱하기

**

제곱

/

나누기

//

나누기 연산 후 소수점 이하의 수를 버리고, 정수 부분의 몫을 구함

%

나누기 연산 후 몫이 아닌 나머지를 구함

++

증감 연산자 (전치; 먼저 변수의 값을 증감시킨 후 연산에 사용)

--

감소 연산자 (후치; 먼저 변수를 연산에 사용한 후 값을 증감시킴)

ex) ++a, --a (연산 전 ↑, ↓)

ex) a++, a-- (연산 후 ↑, ↓)

a = num // 10
b = num % 10
c = a +% 10
num = b * 10 + c

위 코드에 보이는 것처럼 // 산술 연산자를 사용해서 68의 정수 부분의 몫인 6을 구하고

% 산술 연산자를 사용해서 68의 나머지 부분인 8을 구했어요.

이걸 이제 문제의 설명처럼 새로운 수를 만들기 위해 더한 뒤, 더한 값의 나머지인 4를 구하고

num 변수로 8 * 10을 통해 8을 10의 자리로 만들고, 새로운 나머지 값인 4를 더해서 새로운 수 84를 만들어줬어요.

이런식으로 새로운 수를 만들 때마다 cnt를 1씩 더해주고

if문을 활용해서 num 변수가 처음 입력된 n(68)값과 같아질 때 비로서 break, 멈춥니다👊

그리고 마지막에 그동안의 cnt를 print해주면 문제풀이 끄-읏!

a = num / / 10       # 6
b = num % 10         # 8
c = (a + b) % 10     # 6 + 8 = 1"4"
num = (b * 10) + c   # 8 + 4 = 84

백준 알고리즘 # 1110번 : 더하기 사이클 (str)

n = input()                               # n = "26"
num = n
cnt = 0

while 1:
   if len(num) == 1:
      num = "0" + num
   plus = str(int(num[0]) + int(num[1]))  # 2 + 6 = "8"
   num = num[-1] + plus[-1]               # "6" + "8" = "68"
   cnt += 1
   if num == n:
      print(cnt)
      break

풀이

이건 번외편인데요. 지인의 도움으로 알게된 또 다른 방법이에요. (정말 감사합니다🙏)

처음 변수설정은 정수(int)풀이와 동일하고 여기서는 while True: 와는 다르게 while 1: 을 설정했습니다.

다음으로 len(num), 즉 입력된 str(문자열)의 길이를 물어보는 건데요.

여기서 26이 입력됐다고 가정을 했으니까, len(num)는 2가 되겠네요.

그리고 문제에서 "먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고"라는 조건을 줬으니

그에 맞게, len(num) 길이가 1이 될 때, 한 자리 수일 때 num 앞에 "0"을 추가해줍니다.

다음은 int(정수)풀이랑 비슷한데요.

먼저 파이썬은 input()으로 어떤 것을 받든지 다 str(문자열)로 입력된 후 list [ ]로 저장이 되요👏

이 특징을 이용해서 입력된 26은 num = [2, 6]이렇게 저장된 상태니

int(num[0]) 2와 int(num[1]) 6을 정수(int)로써 먼저 더해줘서 8을 만들고 이것을 다시 str(문자열)로 저장해요.

그리고 num = [2, 6] 이었던 것을

num[-1], 맨 마지막 문자열인 "6"을 불러오고

plus[-1], 이 경우에는 plus = [8] 밖에 없으니 무조건 "8"이 불려오게되어서

두 문자열을 더하면 "68"이 되고, cnt를 1나 더해줍니다.

마지막 코드는 정수(int)풀이와 마찬가지로

설정한 변수 num와 처음 입력받은 n(26)이 같아지면, cnt를 print하고 break 멈춥니다!

근데 제가 제출한 소스코드를 보면 "맞았습니다!!"는 정수(int)풀이이고

"시간 초과"는 문자열(str)풀이인데요..!!

왜 그런지 VSC에서 돌려보니, 1번째 2번째 테스트 케이스는 잘 되는 반면

3번째 테스트 케이스입력 숫자 1이 while문을 도는데 시간이 너무 많이 들어서 시간 초과가 발생한 것 같습니다😂

그래도 문자열(str)으로 풀이하는 방법은 코딩테스트에서 정말 많이 쓰인다고 하는만큼

알아둬서 손해볼 건 없겠죠?!🤗

자세한 코드가 궁금하신 분들은 아래 GitHub 참고해주세요🙏

 

wook2124/Algorithm

Practice algorithm. Contribute to wook2124/Algorithm development by creating an account on GitHub.

github.com

최종 소스코드

댓글