본문 바로가기
공부-코딩테스트/코테풀이 - 자바, 파이썬

삼각 달팽이-파이썬 (프로그래머스)

by 령과 2021. 12. 30.
 

문제 설명은 아래 링크를 통해서

https://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

나의 풀이 방법

빨->파->검 순으로 보면 6개->5개->4개->3개->2개->1개 식으로 방향이 돌아간다.

 

처음 시도

n=4일 때 필요한 숫자들은 [1,2,3,4, - - -,{n+(n-1)+ ----+1}] number_tmp리스트에 저장한다.

또한 처음 n개 원소를 묶고, 그다음 n-1개 원소를 묶고...... 마지막 1개를 묶을 때까지 감산하여 묶는다.

이렇게 묶으면 3으로 나눈 나머지로 방향을 정할 수 있게 된다.

def solution(n):
    answer=[]
    answer_tmp=[[0]*(i+1) for i in range(n)]
    number_tmp=list(range(1,F(n)+1))
    number_list=[]
    point=0
    for i in range(n,0,-1):
        number_list.append(number_tmp[point:point+i])
        point+=i
    
    x,y=-1,0
    for idx,value in enumerate(number_list):
        count,way=idx//3,idx%3
        if way==0:#아래
            for i in value:
                x+=1
                answer_tmp[x][y]=i
        elif way==1:#위
            for i in value:
                y+=1
                answer_tmp[x][y]=i
        else:
            for i in value:
                x-=1
                y-=1
                answer_tmp[x][y]=i
    for i in answer_tmp:
        answer+=i
    return answer

def F(n):
    if n==1:
        return 1
    else:
        return F(n-1)+n

결과

 

다른 시도

numpy를 사용하고 슬라이싱 등 활용하여 for문을 생략하기도 했지만 마찬가지로 런타임 에러가 발생하였다.

리스트를 만드는 것에서 시간을 줄이고자 for문 자체로 1,2,3,4 -> 5,6,7 -> 8,9 -> 10 을 만들도록 변경하였다.

def solution(n):
    answer=[]
    answer_tmp=[[0]*(i+1) for i in range(n)]
    
    count=0
    x,y=-1,0
    for i in range(n):
        for j in range(i,n):
            count+=1
            if i%3==0:
                x+=1
                answer_tmp[x][y]=count
            elif i%3==1:
                y+=1
                answer_tmp[x][y]=count
            else:
                x-=1
                y-=1
                answer_tmp[x][y]=count
    
    for i in answer_tmp:
        answer+=i
    return answer

 

알게된 점

1. 너무 어렵게 생각하는 경향이 있다. 단순하게 생각해보자.

2. numpy리스트에서 +는 각 요소들을 자리에 맞게 더하거나 브로드캐스팅 처리를 하게된다.

   일반 리스트는 덧셈을 하면 이어 붙인다. =>상황에 맞게 활용하자 이거 때문에 시간 많이 잡아먹었다.

댓글