happyso
study with happyso
happyso
전체 방문자
오늘
어제
  • 분류 전체보기 (302)
    • GIT (3)
    • 컴퓨터 기본 개념 (29)
    • 알고리즘 (125)
      • 알고리즘 문제 (115)
      • 알고리즘 개념 (10)
    • Go (2)
    • 클라우드 (54)
      • DevOps (4)
      • Kubernetes(쿠버네티스) (33)
      • AWS (6)
      • CKA (8)
    • 리눅스(Linux) (18)
      • 컨테이너(Container) (8)
    • Front (22)
      • JavaScript (2)
      • React (20)
    • Python (21)
      • Python 웹 크롤링 (11)
      • Django (7)
      • MachineLearning (3)
    • 데이터베이스 (6)
      • MariaDB (2)
      • MongoDB (4)
    • C언어 (5)
    • Trouble Shooting (2)
    • 네트워크 (8)
      • CCNA (5)
    • 보안 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • replace
  • apply
  • Patch
  • kubernetes
  • 18
  • edit
  • 15

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
happyso

study with happyso

[python] 프로그래머스 > 월간 코드 챌린지 > 삼각 달팽이
알고리즘/알고리즘 문제

[python] 프로그래머스 > 월간 코드 챌린지 > 삼각 달팽이

2021. 1. 6. 13:31

[문제]

1. 문제 설명

정수 n이 매개변수로 주어집니다. 다음 그림과 같이 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후, 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 return 하도록 solution 함수를 완성해주세요.

 

 

2. 제한사항

  • n은 1 이상 1,000 이하입니다.

 

3. 입출력 예

n result
4 [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]

 

[나의 풀이]

def solution(n):
    answer = []
    num = 1
    x = -1
    y = 0
    triangle = [[0]*n for _ in range(n)]
    for i in range(n):
        for j in range(i, n):
            if i % 3 == 0:
                x += 1
            elif i % 3 == 1:
                y += 1
            elif i % 3 == 2:
                x -= 1
                y -= 1
            triangle[x][y] = num
            num += 1
            
    for tri in triangle:
        for t in tri:
            if t != 0:
                answer.append(t)
    return answer

- 도저히 어떤 규칙이 있는지 모르겠어서 찾아보고 겨우 이해했다.

- 삼각형이기 때문에 3으로 나눈다.

- n만큼 내려간 다음, n-1만큼 오른쪽으로 이동하고, n-2만큼 대각선으로 이동하는 규칙이 있다.

- 그렇기 때문에 이중for문을 사용한다.

- 이중 for문을 담을 그릇인 triangle을 저런식으로 초기화 시켜 줘야 한다.

 

 

[다른 사람의 풀이]

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,[])

 

'알고리즘 > 알고리즘 문제' 카테고리의 다른 글

[python] 프로그래머스 > 2016  (0) 2021.01.07
[python] 프로그래머스 > 문자열 > 이상한 문자 만들기  (0) 2021.01.06
[python] 프로그래머스 > 스킬트리  (0) 2021.01.05
[python] 프로그래머스 > 탐욕법(Greedy) > 체육복  (0) 2021.01.05
[python] 프로그래머스 > 문자열 > 문자열 내 마음대로 정렬하기  (0) 2021.01.04
    '알고리즘/알고리즘 문제' 카테고리의 다른 글
    • [python] 프로그래머스 > 2016
    • [python] 프로그래머스 > 문자열 > 이상한 문자 만들기
    • [python] 프로그래머스 > 스킬트리
    • [python] 프로그래머스 > 탐욕법(Greedy) > 체육복
    happyso
    happyso

    티스토리툴바