코딩테스트 연습 - 삼각 달팽이
5 [1,2,12,3,13,11,4,14,15,10,5,6,7,8,9] 6 [1,2,15,3,16,14,4,17,21,13,5,18,19,20,12,6,7,8,9,10,11]
programmers.co.kr
설명
코딩을 막 배울때 한번쯤 접해봤을 달팽이 찍기의 삼각형 버전 입니다.
소스코드
def solution(n):
arr = [[0] * n for i in range(n)]
maxnum = 0
for i in range(1,n+1):
maxnum = maxnum + i
x = y = 0
num = 1
switch = 0
while(num <= maxnum):
arr[x][y] = num
if switch == 0:
x = x + 1
if x > n-1 or arr[x][y] != 0:
switch = 1
x = x - 1
y = y + 1
elif switch == 1:
y = y + 1
if y > n-1 or arr[x][y] != 0:
switch = 2
y = y - 1
num = num - 1
elif switch == 2:
x = x - 1
y = y - 1
if x == 0 or arr[x][y] != 0:
switch = 0
x = x + 1
y = y + 1
num = num - 1
num = num + 1
arr2 = []
for i in range(len(arr)):
for j in range(len(arr)):
if arr[i][j] != 0:
arr2.append(arr[i][j])
return arr2
* 아래 예시는 6층 (n = 6)인 상황을 가정으로 설명합니다.
![](https://blog.kakaocdn.net/dn/b9ksHP/btrFkZfOefv/eu1J6ZRXmJztTyp08uh62k/img.png)
arr = [[0] * n for i in range(n)]
6 * 6의 리스트(배열)을 생성하고, 모두 0으로 가득 채웁니다.
maxnum = 0
for i in range(1,n+1):
maxnum = maxnum + i
피라미드의 칸의 갯수가 몇개인지 카운트합니다 (maxnum)
일반적인 달팽이 숫자를 풀이할 때엔 총 2개의 switch(경우) 를 사용하여 풀이하곤 합니다.
저는 이를 응용하여 이 문제에선 3개의 switch(경우)로 나누어 문제를 풀이했습니다.
i) switch == 0 (아래쪽으로 증가)
if switch == 0:
x = x + 1
if x > n-1 or arr[x][y] != 0:
switch = 1
x = x - 1
y = y + 1
x,y값중 x값을 1씩 증가시켜
아래로 내려가는 경우이며, 배열의 최대값을 벗어나거나 다음 값이 0이 아닐때 switch를 2로 전환합니다.
ii) switch == 2 (오른쪽으로 증가)
elif switch == 1:
y = y + 1
if y > n-1 or arr[x][y] != 0:
switch = 2
y = y - 1
num = num - 1
오른쪽으로 증가하는 경우입니다.
x값을 증가시켰던 switch = 1과는 달리 y값이 증가합니다
마찬가지로 배열의 최대값을 넘어가거나 다음값이 0이 아닐 경우 switch를 2로 전환합니다.
iii) switch = 3 (대각선으로 증가)
elif switch == 2:
x = x - 1
y = y - 1
if x == 0 or arr[x][y] != 0:
switch = 0
x = x + 1
y = y + 1
num = num - 1
왼쪽 위 방향(대각선) 방향으로 증가하는 경우입니다.
계속 증가하다가 다음 값이 0이 아닐 때 (위 사진에서는 1) switch를 0으로 전환합니다.
이 3개의 switch가 있는 if ~ elif문을 통째로
while(num <= maxnum):
반복분으로 감싸주고
num = num + 1을 반복하며
num이 위에서 구한 maxnum이 커지기 전까지 반복함으로써
위와 같은 리스트(배열)을 얻을 수 있읍니다.
여기서 0을 제거한 후 값을 return 하면 완성됩니다.
후기
네이버 블로그를 사용할때 포스팅 했던 글입니다.
블로그를 네이버 -> 벨로그 -> 티스토리로 이전하면서,
기존 블로그의 글들을 티스토리로 옮겼는데
누락되어 옮기지 않은 글이 하나 있어 이번에 옮겼습니다.
작년 초 쯤에 파이썬을 배우면서 풀어봤던 문제같은데,
오랜만에 파이썬을 보니 반갑네요.
지금은 코틀린을 주 언어로 사용하고 있긴 하지만,
파이썬은 확실히 매력적인 언어인 것 같습니다.
'코딩테스트 > Python' 카테고리의 다른 글
[백준 5211번] [Python] 가단조와 다장조 (0) | 2022.11.11 |
---|---|
[백준 5426번] [Python] 비밀 편지 (1) | 2022.11.11 |
[백준 4998번] [Python] 저금 (0) | 2022.11.03 |
[백준 2810번] [Python] 컵홀더 (0) | 2022.11.03 |
[백준 17358번] [Python] 복불복으로 지구 멸망 (0) | 2022.10.14 |