< 구현 >
- 리스트는 문자열을 담고 있다.
- 정해진 숫자의 리스트 요소로 잘라서 각각 출력한다.
# 밑에 구현은 이해도 어렵고 C 스타일로 구현한 것으로 보인다. 24년이 된 지금 파이썬 답게 다시 한 번 구현해 본다.
fruits = ['apple', 'banana', 'cherry',
'dragon fruit', 'Elderberry', 'Feijoa', 'Guava']
divider = 4
split_position = [(i, i+divider) for i in range(0, len(fruits), divider)]
for start, end in split_position:
print(fruits[start:end])
# Output:
# ['apple', 'banana', 'cherry', 'dragon fruit']
# ['Elderberry', 'Feijoa', 'Guava']
# 알고리즘이고 뭐고 없다. 그냥 원하는 슬라이스 인덱스를 추출하고 그대로 슬라이싱하는게 간단하다.
# 주는 것과 받는 것 두 개로 구현된 것이 나중에도 이해하기 쉬울 듯
- 알고리즘 고민
이제는 알고리즘에 대해서 고민해 보자.
구현 스펙중 하나는 정수 개수만큼 요소를 끊어서 출력하라는 것이다.
이 정수 개수를 정의해 보자.
separator 이던 divider 이던 상관없다. 의미만 통하면 되나까.
divider = 3
# 리스트의 요소를 세 개씩 끊어 출력한다. 이 변수는 요소 3개씩 끊어 출력함을 의미한다.
- 맨 처음에는 리스트 요소 인덱스 0 에서 3까지 출력하면 요소 3개가 될 것이다. 확인해 보자.
- print(colors[0:3])
- (결과)
- ['red', 'yellow', 'black']
- 그럼 두 번째 출력 내용은 어떻게 나타낼 수 있나? [0:3]까지로 3개 요소를 꺼냈으니 [4:6] 인가? 아니다.
- print(colors[3:6])
- (결과)
- ['brown', 'white', 'purple']
- 즉, 리스트 슬라이스 해서 꺼낸 결과를 출력하면 되는데 슬라이스를 하는 숫자만 원하는 숫자로 만들어 내면 된다. 다음과 같이 표현 가능하다.
- 숫자 요소로 표현
- colors[0:3] -> colors[3:6]
- 변수로 표현
- colors[startPos : i]
- for ~ range 함수와 변수로 표현한 리스트 슬라이스의 결합
- 위에서 배운 문법을 이용해서 원하는 결과 (첫번째 회돌이에서는 0:3 두번째 회돌이에서는 3:6 이 나오려면)
for i in range(startPos, endPos+divider, divider):
colors[startPos : i]
따라서, 다음의 코드로 표현이 가능하다.
colors = ['red', 'yellow', 'black', 'brown', 'white', 'purple']
start_pos = 0
end_pos = len(colors)
div = 3
for idx in range(start_pos, end_pos + div, div):
out = colors[start_pos:start_pos + div]
if out != []:
print(out)
start_pos = start_pos + div
# 결과
['red', 'yellow', 'black']
['brown', 'white', 'purple']
원하는 요소 개수로 끊어서 출력하기 위해서 슬라이스 표기법의 숫자를 원하는 대로 생성하는 방법을 사용했다. 회돌이하면서 [] 리스트가 출력될 수 있으므로 비어 있을 때는 출력하지 않는다.
divider = 3 의 결과
['red', 'yellow', 'black']
['brown', 'white', 'purple']
divider = 5 의 결과
['red', 'yellow', 'black', 'brown', 'white']
['purple']
divider = 7 의 결과
['red', 'yellow', 'black', 'brown', 'white', 'purple']
또 다른 구현 방법은 다음과 같다. 리스트 슬라이스는 이용하지 않고 배열의 개수만 가지고 로직을 만들어 보았다.
확실히 슬라이스의 특성을 이용하지 않으면 로직이 복잡해 지고 실수의 여지가 많지만 if ~ then의 논리력을 연습하기에는 좋은 것 같다.
댓글 영역