누군가에게 파이썬을 가르치고 있는데 진행하던 중에 내었던 문제에 대한 문제 풀이를 시도해 보겠다.
< 구현스펙 >
- 리스트는 문자열을 담고 있다.
- 정해진 숫자의 리스트 요소로 잘라서 각각 출력한다.
지금부터 나의 구현을 설명한다.
colors = ['red', 'yellow', 'black', 'brown', 'white', 'purple']
먼저 파이썬의 대표적인 특징인 리스트에 대해서 살펴보자.
print(type(colors))
(결과)
<type 'list'>
- 데이터 유형은 리스트 타입임을 알 수 있다.
이 리스트 전체를 집합으로 볼 때 이 집합의 개별 요소를 사용하기 위해서는 다음의 방법을 쓸 수 있다.
<리스트 요소에 접근하는 방법 1>
for color in colors:
print(color)
(결과)redyellowblackbrownwhitepurple
<리스트 요소에 접근하는 방법 2>
startPos = 0
colorLength = colors.__len__()
for i in range(startPos, colorLength):
print(colors[i:i+1])
(결과)
['red']
['yellow']
['black']
['brown']
['white']
['purple']
- colorLength = colors.__len__()
: .__len__()는 리스트 객체의 메쏘드로 객체의 원소 개수를 리턴한다. 즉, colorLength 에는 6이 들어가며 이는 colors 리스트의 원소 개수가 6개임을 의미한다.
- for i in range()
: for문 에서 쓰는 range() 함수는 정의한 조건의 숫자 리스트를 생성한다. 따라서, range(0, 6)은 [0, 1, 2, 3, 4, 5]의 range 객체가 생성된다. 이어서 for 문의 in 뒤에 놓임으로써 for문에 의해 다음의 결과가 나온다.
for i in range(0, 6):
print(i)
(결과)
0
1
2
3
4
5
- colors[i:i+1]
: 이제 리스트 슬라이스에 대해서 알아볼 차례이다. 리스트에서 원하는 요소를 추출해내는 표기법을 말하는데 대표적인 사용법은 다음과 같다. (타이핑 하면서 그 결과를 반드시 확인해 보기 바란다.)
- 리스트 내의 모든 요소를 의미할 때
print ( listVariable[:] )
- 요소중 첫번째 요소만 의미할 때
print(colors[0:1])
- 요소중 마지막 요소만 의미할 때
print(colors[-1:])
- 요소중 마지막 바로 전 요소만 의미할때
print(colors[-2:-1])
- 요소중 마지막 요소와 바로 전 요소 모두를 의미할때
print(colors[-2:])
- 요소중 첫번째 요소와 두 번째 요소 모두를 의미할때
print(colors[0:2])
: 즉, colors[i:i+1]는 index로 쓰인 i 변수 위치에 해당하는 요소 하나를 꺼내는 것이다.
- 여기서 <리스트 요소에 접근하는 방법 1> / <리스트 요소에 접근하는 방법 2>의 결과를 주목해서 보자.
생긴 모양이 다른데 방법 1 에서는 스트링이 출력되고 있으며, 방법 2 에서는 개별 리스트의 형태를 가지고 있다.
- 알고리즘 고민
이제는 알고리즘에 대해서 고민해 보자.
구현 스펙중 하나는 정수 개수만큼 요소를 끊어서 출력하라는 것이다.
이 정수 개수를 정의해 보자.
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의 논리력을 연습하기에는 좋은 것 같다.
댓글 영역