프로그래밍 언어/Python
[파이썬] 코딩도장 이터레이터 문제 (39.6 - 39.7)
작지만 중요한 것들을 발견하는 블로그.
2024. 5. 20. 22:34
이터레이터가 감이 잡히지 않아, JUNG퍼실님께 코딩도장을 추천 받아 방문하였는데
처음에는 아예 감도 잡히지 않았지만, 이론을 먼저 학습하고 이터레이터를 클래스로 구현해보면서 감을 잡기 좋았습니다!
코딩도장 파이썬 100제도 시간날때마다 조금씩 풀었더니 레벨도 4로 올라가더군요.
39.6 연습문제: 배수 이터레이터 만들기
코드
# class 정의
class MultipleIterator:
# 초기화
def __init__(self, stop, multiple):
self.current = 0 # 현재 숫자 유지, 0부터 지정된 숫자 직전까지 반복
self.stop = stop # 반복을 끝낼 숫자
self.multiple = multiple
# __iter__() 함수
def __iter__(self): # 현재 인스턴스를 반환
return self
# __next__() 함수를 호출할 때마다 하나씩 넘어간다.
def __next__(self):
if self.current < self.stop:
self.current += 1
r = self.current * self.multiple
return r
else:
raise StopIteration
# 실행 부분
for i in MultipleIterator(20, 3):
print(i, end=' ')
print()
for i in MultipleIterator(30, 5):
print(i, end=' ')
실행결과
39.7 연습문제: 배수 이터레이터 만들기
이 문제는 정말 열심히 고민해보고, 결국 힌트를 보면서 풀었는데 이방식, 저방식 해보면서 결국 블로그에 있는 답까지 똑같이 다 배껴보았는데 실제로 코랩에서는 내가 짠 코드도, 블로그에 있는 코드도 잘 작동하지만,
코딩 도장에서 답을 입력하면 작동하지 않는 코드라면서 답이 틀렸다고 나와서 억울했다..ㅋㅋㅋ 1시간 가까이 싸웠지만 오늘은 도장을 깨지는 못했다.. 내일은 기필코 깨리라..! (누가 답을 안다면 알려주셨으면..ㅎㅎㅎ)
코드
class TimeIterator:
def __init__(self, start, stop):
self.start = start
self.stop = stop
def __getitem__(self, index):
if index < self.stop - self.start:
hour = (( self.start + index ) // (60 * 60) ) % 24
min = (( self.start + index ) // 60 ) % 60
sec = ( self.start + index ) % 60
return '{0:02d}:{1:02d}:{2:02d}'.format(hour, min, sec)
else:
raise StopIteration
start, stop, index = map(int, input().split())
for i in TimeIterator(start, stop):
print(i)
print('\n', TimeIterator(start, stop)[index], sep='')
사실 이터레이터 만들기하려다가 다른걸 보면서 인덱스가 있는 이터레이터를 꼭 만들어야하나 싶었는데
오히려 클래스를 만들어보면서 클래스에도 익숙해지고, 새로운 함수나, 클래스에서 self를 쓰는 방식들과 조금 친밀해지는 것 같아 좋았다. 끄적끄적 다음에는 코드만 올리기보다 분투했던 흔적을 더욱 쓰면 좋겠습니다..ㅎㅎ!
영감님 말투같긴 하지만 천리길도 한걸음부터라지요.. 화이팅입니닷!
# 코딩도장을 하며 새로 알게된 함수
a, b, c = map(int, input().split())
# 처음 써본 신기한 리턴방식
return '{0:02d}:{1:02d}:{2:02d}'.format(hour, min, sec)
# 인덱스가 있는 이터레이터를 만들때 사용하는 함수
def __getitem__(self, index):