프로그래머스 - 택배 상자 꺼내기 (파이썬)
글 작성자: pental
https://school.programmers.co.kr/learn/courses/30/lessons/389478?language=python3
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
풀이
다른 사람 풀이를 보고 한숨을 쉬었던 문제이다..
def solution(n, w, num):
m1 = num%(w*2)
m2 = ((w*2+1) - m1)%(w*2)
# num 이상 n 이하의 수들 중 2*w로 나눈 나머지가 m1,m2인 것들의 수를 세면 된다.
return len(range(num,n+1,w*2)) + len(range(num + (m2-m1)%(w*2), n+1, w*2))
상상도 못해본 풀이이다.
array = [[] for i in range((n // w) + 1)]
일단 나는 이차원 배열을 n // w + 1 만큼 만들어 택배가 쌓아질수 있는 총 높이 만큼 만들었다.
row = 0
current_w = 0
for i in range(1, n + 1) :
array[row].append(i)
current_w += 1
if current_w >= w :
row += 1
current_w = 0
그리고 각각 택배상자들을 지그재그로 놓기 전에, 왼쪽에서 오른쪽으로 모두 옮기는 작업을 진행하였다.
이거 말고도 다른게 하는 방법이 있을텐데 새벽에 대충 푼거라 머리가 잘 안돌아 간다.
if len(array) > 1 and len(array[-1]) != len(array[-2]):
for i in range(len(array[-2]) - len(array[-1])):
array[-1].append("X")
그리고 지그재그로 쌓다보면 아마 빈 공간이 반대로 되있는 경우도 존재 할 것이다. 아래 상황처럼.
이걸 방지하기 위해서 X라는 임의의 택배 상자를 집어 넣었다.
for i in range(len(array)) :
if i % 2 == 1 :
array[i].reverse()
무식하게 두번째 줄의 배수는 reverse 해서 택배 위치 맞춰주기
[[1, 2, 3, 4, 5, 6], [12, 11, 10, 9, 8, 7], [13, 14, 15, 16, 17, 18], ['X', 'X', 22, 21, 20, 19]]
지금까지는 이렇게 택배 상자를 모두 놓을 수 있었다.
box_row = 0
box_col = 0
for i in range(len(array)) :
for j in range(len(array[0])):
if array[i][j] == num :
box_row, box_col = i, j
break
print(box_row, box_col)
찾아야 하는 택배 상자의 위치를 찾고,
for index, value in enumerate(array) :
if index >= box_row :
if array[index][box_col] != "X" :
answer.append(array[index][box_col])
택배 상자의 위치에서 위로 있는 택배들만 answer에 집어넣으면 끝
코드
def solution(n, w, num):
answer = []
array = [[] for i in range((n // w) + 1)]
row = 0
current_w = 0
for i in range(1, n + 1) :
array[row].append(i)
current_w += 1
if current_w >= w :
row += 1
current_w = 0
if len(array) > 1 and len(array[-1]) != len(array[-2]):
for i in range(len(array[-2]) - len(array[-1])):
array[-1].append("X")
for i in range(len(array)) :
if i % 2 == 1 :
array[i].reverse()
print(array)
box_row = 0
box_col = 0
for i in range(len(array)) :
for j in range(len(array[0])):
if array[i][j] == num :
box_row, box_col = i, j
break
print(box_row, box_col)
for index, value in enumerate(array) :
if index >= box_row :
if array[index][box_col] != "X" :
answer.append(array[index][box_col])
return len(answer)
'Programming > 프로그래머스' 카테고리의 다른 글
프로그래머스 - 배달 (파이썬) (0) | 2025.03.30 |
---|---|
프로그래머스 - 마법의 엘리베이터 (파이썬) (0) | 2025.03.29 |
[프로그래머스] 달리기 경주 (2) | 2025.03.24 |
[프로그래머스/JAVA] 프로그래머스 문제 모음 (0) | 2021.11.02 |
[프로그래머스] 행렬의 합 (0) | 2020.10.12 |
댓글
이 글 공유하기
다른 글
-
프로그래머스 - 배달 (파이썬)
프로그래머스 - 배달 (파이썬)
2025.03.30 -
프로그래머스 - 마법의 엘리베이터 (파이썬)
프로그래머스 - 마법의 엘리베이터 (파이썬)
2025.03.29 -
[프로그래머스] 달리기 경주
[프로그래머스] 달리기 경주
2025.03.24 -
[프로그래머스/JAVA] 프로그래머스 문제 모음
[프로그래머스/JAVA] 프로그래머스 문제 모음
2021.11.02