-
[프로그래머스] 삼각 달팽이 / Swift프로그래밍/코딩테스트 2021. 6. 5. 13:22
[문제 보기]
더보기정수 n이 매개변수로 주어집니다. 다음 그림과 같이 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후, 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 return 하도록 solution 함수를 완성해주세요.
제한사항
- n은 1 이상 1,000 이하입니다.
입출력 예
n, result4 [1,2,9,3,10,8,4,5,6,7] 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]
입출력 예 설명
입출력 예 #1
- 문제 예시와 같습니다.
입출력 예 #2
- 문제 예시와 같습니다.
입출력 예 #3
- 문제 예시와 같습니다.
https://programmers.co.kr/learn/courses/30/lessons/68645
예전에 풀었던 달팽이 문제는 사각형이었는데 이번에는 삼각형인 문제였다.
import Foundation func solution(_ n:Int) -> [Int] { var mat = [[Int]](repeating: [Int](repeating: 0, count: n), count: n) var count = 0 var pos = (0, 0) var number = 1 while count < n { switch count % 3 { case 0: // 아래 for i in 0..<(n - count) { mat[pos.0 + i][pos.1] = number number += 1 } pos = (pos.0 + n - count - 1, pos.1 + 1) case 1: // 오른쪽 for i in 0..<(n - count) { mat[pos.0][pos.1 + i] = number number += 1 } pos = (pos.0 - 1, pos.1 + n - count - 1 - 1) case 2: // 대각선 for i in 0..<(n - count) { mat[pos.0 - i][pos.1 - i] = number number += 1 } pos = (pos.0 - (n - count - 1) + 1, pos.1 - (n - count - 1)) default: break } count += 1 } var result = [[Int]](repeating: [], count: n) for i in 0..<mat.count { result[i] = Array(mat[i][0...i]) } return result.flatMap { $0 } }
생각 정리
다른 풀이를 찾아보니 dx, dy 배열을 이용하여 간단하게 푼 방법이 있었다.
def solution(n): dx=[0,1,-1];dy=[1,0,-1] b=[[0]*i for i in range(1,n+1)] x,y=0,0;num=1;d=0 while num<=(n+1)*n//2: b[y][x]=num ny=y+dy[d] nx=x+dx[d] num+=1 if 0<=ny<n and 0<=nx<=ny and b[ny][nx]==0: y, x = ny, nx else: d=(d+1)%3 y+=dy[d] x+=dx[d] return sum(b,[])
반응형'프로그래밍 > 코딩테스트' 카테고리의 다른 글
[프로그래머스] 쿼드압축 후 개수 세기 / Swift (0) 2021.06.06 [프로그래머스] 괄호 회전하기 / Swift (0) 2021.06.05 [프로그래머스] 다리를 지나는 트럭 / Swift (0) 2021.06.04 [2018 카카오 BLIND 3차] 방금그곡 / Swift (0) 2021.06.03 [2019 카카오 BLIND] 후보키 / Swift (0) 2021.06.02