본문 바로가기

알고리즘 & 코딩테스트/코딩테스트

Programmers Lv.1 "자릿수 더하기"

Programmers Lv.1 자릿수 더하기, 연습문제, 정답률 87%

요 문제는 주어진 숫자의 자릿수를 분리하는 것이 핵심이다.
무슨말이냐 하면 125의 숫자가 들어왔을 때 우리는 3자리 숫자 125로 보지만 간혹 125의 각 자릿수를 분할하여 1, 2, 5로 나눠서 생각해야할 때가 있다는 것이다. 이때 자주 사용하는 알고리즘이 데이터 타입간 변화를 이용한 것이다.
자세한 내용은 다음과 같다.

  1. 자연수 n이 주어진다.
  2. n의 데이터 타입을 문자열로 변환한다. (Python의 경우 str()이 되겠다.)
  3. 문자열로 바꾼 n은 iterable객체가 되므로 각각의 원소를 분리할 수 있다.
def solution(n):
    answer = 0
    for e in str(n):
        answer += int(e)
    return answer

파이썬의 Iterable 객체는 문자열(string), 리스트(list), 딕셔너리(dictionary), 집합(set), 튜플(tuple), range 등이 있다.
비슷한 개념으로 이터레이터(iterator)가 있다. 이에 대한 정리를 이번에 해보도록 하겠다.

1) 이터레이션(iteration)

어떠한 객체의 원소에 하나씩 차례대로 접근하는 것을 말한다. 파이썬에서는 반복문과 같이 사용하게 되는데 이 개념을 적용한 2가지 분류가 나뉜다.

1-1) 이터러블(iterable) : 반복 가능한 객체

  • __iter__

1-2) 이터레이터(iterator) : 값을 차례대로 꺼낼 수 있는 객체

  • __iter__
  • __next__

출처: https://dojang.io/mod/page/view.php?id=2405

하나의 예시를 놓고 생각해보면 바로 알 수 있다.

for i in range(100):

우리는 위의 코드를 0부터 99까지 연속된 숫자를 만들어내는 반복문이다.
사실은 숫자를 모두 만들어 내는 것이 아니라 0부터 99까지 값을 차례대로 꺼낼 수 있는 이터레이터를 하나만 만들어내며, 이후 반복할 때마다 이터레이터에서 숫자를 하나씩 꺼내서 반복하는것이다!!
이처럼 숫자를 미리 만들어놓는것이 아닌 이터레이터 하나만 만들고 필요한 시점이 되었을 때 값을 만들게 되는 즉, 데이터 생성을 뒤로 미루는 방식을 지연평가(Lazy evaluation)라고 한다. 쉽게 이터레이터는 메모리 효율을 위해 쓴다고 생각하면 된다.

그렇다면 시퀀스 객체와는 뭐가 다를까?
결론부터 말하면 시퀀스 객체가 좀 더 작은 범위에 속한다. 아래 그림을 보면 이해가 될 것이다.

출처 : https://sikaleo.tistory.com/61https://sikaleo.tistory.com/61