문제 설명은 아래 링크를 통해서
https://programmers.co.kr/learn/courses/30/lessons/68645
나의 풀이 방법
빨->파->검 순으로 보면 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리스트에서 +는 각 요소들을 자리에 맞게 더하거나 브로드캐스팅 처리를 하게된다.
일반 리스트는 덧셈을 하면 이어 붙인다. =>상황에 맞게 활용하자 이거 때문에 시간 많이 잡아먹었다.
'공부-코딩테스트 > 코테풀이 - 자바, 파이썬' 카테고리의 다른 글
메뉴 리뉴얼 (코딩테스트, 프로그래머스) (0) | 2022.01.19 |
---|---|
타겟 넘버 (코딩테스트, 프로그래머스) (0) | 2022.01.19 |
코딩테스트 문제 : 거리두기 확인하기 (프로그래머스) (0) | 2022.01.13 |
피로도 파이썬(프로그래머스) (0) | 2022.01.05 |
땅따먹기 파이썬 (프로그래머스) (0) | 2021.12.27 |
댓글