https://www.codewars.com/kata/534e01fbbb17187c7e0000c6/train/python
내 코드
출력 답을 보았을 때 회오리 모양처럼 보여서 0으로 초기화된 리스트에 회전을 시키면서 값을 1로 바꾸었다.
아래는 N이 5일 때(문제에서 최소 N이 5이다.) 회전하는 모습을 나타낸 것이다.
N이 10일 경우는 아래와 같다.
N이 10일 경우 아래와 같을 때 0을 1로 변경해야 한다. list[index][start ~ end]라고 할 때 아래와 같다.
1. list[0][0 ~ 9]
2. list[0][0 ~ 9]
3. list[0][0 ~ 9]
------------------------end 변화 구간(2씩 감소)
4. list[0][0 ~ 7]
------------------------index 변화 구간(2씩 증가)
5. list[2][0 ~ 7]
------------------------start 변화 구간(2씩 증가)
6. list[2][2 ~ 7]
7. list[2][2 ~ 7]
------------------------end 변화 구간(2씩 감소)
8. list[2][2 ~ 5]
------------------------index 변화 구간(2씩 증가)
9. list[4][2 ~ 5]
------------------------start 변화 구간(2씩 증가)
10. list[4][4 ~ 5]
각각 변화 구간이 다르기 때문에 if문을 사용하여 코드를 제작했다.
그림과 위의 글에서는 순서를 1에서 10으로 표시하였지만 아래 코드에서는 0~9를 사용했다.
덧붙여서 리스트를 회전시키면서 문제를 풀었기 때문에 답을 제출하기 전에는 원래 상태가 되도록 회전을 시켜주었다.
# My Code
def spiralize(size):
# spiral 리스트에 전부 0으로 초기화
spiral = [[0] * size] * size
# 맨 첫 줄을 1로 변경
spiral[0] = [1] * size
# list[i][j]를 풀기 위한 변수들
# index가 i에 해당되고 start와 end는 j의 범위
index = 0
start = 0
end = size
# 맨 첫 줄을 제외하고 돌려가면서 값 변경
for i in range(1, size):
spiral = list(map(list, zip(*spiral)))[::-1]
for j in range(start, end):
spiral[index][j] = 1
if i % 4 == 3:
index += 2
elif i % 4 == 0:
start += 2
elif i % 4 == 2:
end -= 2
# 회전 시키면서 값을 바꿨기 때문에 원래 자리로 돌리기 위해서 남은 회전을 해줌
for i in range(5, size % 4, -1):
spiral = list(map(list, zip(*spiral)))[::-1]
return spiral
# 출력 예쁘게 보려고 pprint 사용
from pprint import pprint
if __name__=='__main__':
answer = spiralize(5)
pprint(answer)
answer = spiralize(8)
pprint(answer)
answer = spiralize(11)
pprint(answer)
answer = spiralize(14)
pprint(answer)
|
코드워에서는 문제를 다 풀고 나면 다른 사람의 코드를 볼 수 있는데, 다른 사람들과 코드가 달라서 놀라웠다.
그리고 항상 느끼는 거지만 내 코드는 항상 부족한 느낌이다.
'알고리즘 > 코드워' 카테고리의 다른 글
[python]Permutations (0) | 2020.04.13 |
---|---|
[python]Is the string uppercase? (0) | 2020.04.12 |
[python]altERnaTIng cAsE <=> ALTerNAtiNG CaSe (0) | 2020.04.08 |
[python]Is my friend cheating? (0) | 2020.04.06 |
[python]Human readable duration format (0) | 2020.04.03 |