알고리즘/코드워

[python]Snail

(ㅇㅅㅎ) 2020. 11. 16. 16:48
728x90
반응형

www.codewars.com/kata/521c2db8ddc89b9b7a0000c1/train/python

 

Codewars: Achieve mastery through challenge

Codewars is where developers achieve code mastery through challenge. Train on kata in the dojo and reach your highest potential.

www.codewars.com

이 문제는 위와 같은 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