개발하는 사막여우
개발하는 사막여우
개발하는 사막여우
전체 방문자
오늘
어제
  • All (310)
    • Books (13)
      • 읽기 좋은 코드가 좋은 코드다 (13)
    • Study (6)
      • Blockchain (3)
      • Algorithm (3)
    • Baekjoon (36)
    • Programmers (166)
    • LeetCode (15)
    • Open Source (1)
      • Youtube Popout Player (1)
    • Language (32)
      • Python (9)
      • JS (8)
      • Java (5)
      • HTML (6)
      • CSS (4)
    • Library & Framework (15)
      • React.js (15)
    • IDE (2)
      • IntelliJ (2)
    • Airdrop (9)
    • Tistory (2)
    • etc.. (12)
      • Cozubi (6)
      • lol-chess (0)

블로그 메뉴

  • Github

공지사항

인기 글

태그

  • 파이썬
  • 클린 코드 작성법
  • 코딩테스트연습
  • 카카오 공채
  • 카카오 코딩테스트
  • 읽기 좋은 코드가 좋은 코드다
  • 카카오 알고리즘 문제
  • 코주비
  • Cozubi
  • 코인줍줍
  • Python
  • 신규 코인 에어드랍
  • 프로그래머스
  • 알고리즘문제풀이
  • 클린 코드
  • 프로그래머스 위클리 챌린지
  • 2018 KAKAO BLIND RECRUITMENT
  • programmers
  • 백준
  • Java

최근 댓글

최근 글

티스토리

반응형
hELLO · Designed By 정상우.
개발하는 사막여우

개발하는 사막여우

[프로그래머스] 삼각 달팽이 / Python
Programmers

[프로그래머스] 삼각 달팽이 / Python

2021. 1. 20. 20:37
반응형

문제주소 : programmers.co.kr/learn/courses/30/lessons/68645#

 

코딩테스트 연습 - 삼각 달팽이

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


<문제 설명>

더보기

문제 설명

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


제한사항

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

입출력 예

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]

입출력 예 설명

입출력 예 #1

  • 문제 예시와 같습니다.

입출력 예 #2

  • 문제 예시와 같습니다.

입출력 예 #3

  • 문제 예시와 같습니다.

 

<풀이법>

▒ 한줄 개념: 조건 ▒ 

굉장히 노가다성이 짙은 문제였다고 생각이 듭니다. 여태까지의 문제들에 비해 규칙이 조금 더 복잡하게 사용된 것 같습니다. 어떤 하나의 규칙을 찾아 딱 하고 풀어내기엔 조건을 나눠야하는 것이 많다고 생각이 들었습니다.

그에 따라 조건을 위한 변수 사용도 다양했습니다.

 

풀이 방식은 다음과 같습니다.

1. 삼각형마다 달팽이 한마리

 

삼격형마다 한바퀴씩을 한번의 반복으로 두었습니다. 다음과 같은 n=6 삼각형의 경우, 총 2번의 큰 반복이 필요합니다.

하나의 삼각형에 대해 한 바퀴를 돌고, 작은 내부 삼각형에 대해 한 바퀴를 또 돌게 됩니다.

 

2. 한 바퀴를 세 부분으로 나누기

삼각형에 대한 한 바퀴가 다음과 같이 3가지 경우로 나뉘어집니다.

내려가면서 한번, 맨 밑에서 한번, 올라오면서 한번.

 

3. 삼각형에 따른(1번 조건) 3가지 부분을 나누기 위한(2번 조건) 여러가지 변수들

s: 1번 조건을 보면 삼각형이 점점 작아집니다. 이 삼각형의 사이즈를 정해주기 위한 조건이 s입니다.

d: 1번 조건에서 다음 삼각형의 시작위치를 잡아주기 위한 변수 d입니다. 

b: 1번 조건에서 다음 삼각형에 대해, 2번 조건의 3가지 경우에 대한 위치를 잡아주기 위한 변수b입니다.

 

 

<코드(Python)>

from functools import reduce
def solution(n):
    answer = []
    total_count = int(n * (n + 1) / 2)  # 전체 숫자의 수

    for i in range(1,n+1):     # 미리 전체 배열 만들어주기. 넣기 편하게
        block =[]
        for j in range(i):
            block.append(0)
        answer.append(block)

    t = 1
    s = n
    b = 0
    d = 0
    while True:                # 큰 반복. 조건 1
        for i in range(s):               # 조건 2-1
            answer[i+d][0+b] = t
            t += 1
            if t == total_count+1:
                return list(reduce(lambda x,y:x+y, answer))
            
        for i in range(1, s):            # 조건 2-2
            answer[-1-b][i+b] = t
            t += 1
            if t == total_count+1:
                return list(reduce(lambda x,y:x+y, answer))
            
        for i in range(s-2, 0, -1):      # 조건 2-3
            answer[i+d][-1-b] = t
            t += 1
            if t == total_count+1:
                return list(reduce(lambda x,y:x+y, answer))
        s -= 3
        b += 1
        d += 2

    return list(reduce(lambda x,y:x+y, answer))

여러모로 코드가 지저분해 보인다는 생각이 드네요. 나중에 다시 풀어봐야 할 것 같은 문제입니다.

 

더 많은 코드 보기(GitHub) : github.com/dwkim-97/CodingTest

 

 

반응형

'Programmers' 카테고리의 다른 글

[프로그래머스] 타겟 넘버 / Python  (2) 2021.01.21
[프로그래머스] 피보나치 수 / Python  (0) 2021.01.21
[프로그래머스] 행렬의 곱셈 / Python  (0) 2021.01.20
[프로그래머스] 예상 대진표 / Python  (0) 2021.01.20
[프로그래머스] 땅따먹기 / Python / 반례 포함  (0) 2021.01.20
    'Programmers' 카테고리의 다른 글
    • [프로그래머스] 타겟 넘버 / Python
    • [프로그래머스] 피보나치 수 / Python
    • [프로그래머스] 행렬의 곱셈 / Python
    • [프로그래머스] 예상 대진표 / Python
    개발하는 사막여우
    개발하는 사막여우
    개발개발 주저리주저리

    티스토리툴바