www.codewars.com/kata/521c2db8ddc89b9b7a0000c1/train/python
이 문제는 위와 같은 2차원 배열 값이 들어올 때 빨간색 선과 같은 순서로 1차원 배열을 구하는 것입니다.
위와 같은 예의 경우 입력값이 [[1, 2, 3], [4, 5, 6], [7, 8, 9]]인 경우 [1, 2, 3, 6, 9, 8, 7, 4, 5]를 구하는 것입니다.
이 문제에 대한 최종 코드는 더보기를 눌러서 보시면 됩니다. 더보기 아래는 코드가 나오게 된 과정입니다. :D
최종 코드
def snail(snail_map):
result = []
while len(snail_map):
result += snail_map.pop(0)
snail_map = list(zip(*snail_map))[::-1]
return result
|
이 문제를 처음 접근할 때 왼쪽에서 오른쪽으로, 위쪽에서 아래쪽으로, 오른쪽에서 왼쪽으로 그리고 아래쪽에서 위쪽으로 이 4가지의 경우를 출력하면서 출력한 부분을 삭제한다면 풀 수 있다고 생각했습니다.
snail_map 변수를 입력값은 [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 그리고 result 변수를 결과 값이라고 가정하겠습니다.
result 변수를 결과 값이라고 생각하면 다음과 같이 적을 수 있습니다.
1. 왼쪽에서 오른쪽으로
왼쪽에서 오른쪽으로의 경우 2차원 배열의 첫 번째 인덱스 값들을 추가해 주면 됩니다. 그리고 추가한 값을 다시 쓰는 일이 없도록 삭제를 해줍니다.
2. 위쪽에서 아래쪽으로
위쪽에서 아래쪽으로의 경우 2차원 배열의 원소 값인 1차원 배열의 맨 끝 값들만 추가해 주었습니다. 마찬가지로 입력한 값들은 삭제해주었습니다.
3. 오른쪽에서 왼쪽으로
오른쪽에서 왼쪽으로의 경우 2차원 배열의 맨 마지막 값을 입력된 값의 순서와 반대로 추가해주었습니다.
4. 아래쪽에서 위쪽으로
아래쪽에서 위쪽으로의 경우 2차원 배열의 원소 값인 1차원 배열의 제일 첫 번째 값을 입력된 순서와 반대로 추가해주었습니다.
이러한 4가지 경우를 snail_map의 원소 값이 없어질 때까지 반복하도록 설정했습니다.
전체 코드는 다음과 같습니다.
def snail_(snail_map):
result = []
while len(snail_map) > 0:
# 왼쪽에서 오른쪽으로
result += snail_map[0]
del snail_map[0]
# 입력값이 있는지 확인
if len(snail_map) > 0:
# 위쪽에서 아래쪽으로
for i in snail_map:
result += [i[-1]]
del i[-1]
# 입력값이 있다면 오른쪽에서 왼쪽으로
if snail_map[-1]:
result += snail_map[-1][::-1]
del snail_map[-1]
# 아래쪽에서 위쪽으로
for i in reversed(snail_map):
result += [i[0]]
del i[0]
return result
|
이 4 단계는 사실 첫 번째 단계인 왼쪽에서 오른쪽으로 과정을 왼쪽으로 회전시키면서 진행하는 것과 똑같습니다.
그리고 del 대신 pop을 사용하면 값을 꺼냄과 동시에 삭제도 가능해집니다.
그리하여 코드는 다음과 같아질 수 있습니다.
def snail(snail_map):
result = []
while len(snail_map):
result += snail_map.pop(0)
snail_map = list(zip(*snail_map))[::-1]
return result
|
'알고리즘 > 코드워' 카테고리의 다른 글
[python]N-th Power (0) | 2020.11.24 |
---|---|
[python]Grasshopper - Grade book (0) | 2020.11.23 |
[python]Shortest Word (0) | 2020.11.07 |
[python]Equal Sides Of An Array (1) | 2020.11.05 |
[python]Number of People in the Bus (0) | 2020.11.04 |