https://school.programmers.co.kr/learn/courses/30/lessons/42587
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
일단 문제가 엄청 어렵다.............

으음.......
솔직히 너무 어려워서 참고안하고서 못풀었다...
검색해보니 그냥 큐(Queue)나 우선순위큐(Priority Queue)를 사용하면 된다고 한다.
그래서 deque를 이요하면 쉽게 풀 수 있다고한다.
1차 풀이
deque를 이용해서 FIFO 형식으로 풀었다
그리고 튜플을 이용해서 처음 위치를 저장시켰다!
from collections import deque # Queue 가져오기
def solution(priorities, location):
answer = 0
de = deque()
for i, v in enumerate(priorities):
de.append((v, i)) # 처음 위치를 알기위해서 튜플로 저장하기
while len(de):
item = de.popleft()
# 튜플은 맨 앞에 있는 요소를 비교한다.
if item[0] < max(de)[0]: # 가장 큰 값 보다 작으면 뒤로 보내기
de.append(item)
else:
answer += 1
if item[1] == location:
break
return answer
예제 2, 5, 18에서 런타임 에러가 띈다...

힌트를 보니 매번 if문을 통해 가장 큰 수와 앞에 요소를 하나 하나 씩 비교하니 에러가 생기는 듯하다
즉 가장 큰 수보다 작은 것들은 그냥 뒤로 보내버리면 될 듯 하다
2차 풀이
위의 방법으로 잘안되서 그냥 list로 해서 풀었다
배열 안에서 일단 최대값 찾고, 최대값 요소보다 앞에 있는 것들은 다 뒤로 보내는 방식의 알고리즘..
def solution(priorities, location):
answer = 1
list = []
for i, v in enumerate(priorities):
list.append((v, i)) # 처음 위치를 알기위해서 튜플로 저장하기
while len(list):
num = list.index(max(list,key=lambda item:item[0]))
print(num)
for i in range(num):
list.append(list[i])
del list[0:num]
print(list)
if list[0][1] == location:
break
else:
del list[0]
answer += 1
return answer
참고자료) 리스트 안에 튜플의 최대값 찾는 방법
https://stackoverflow.com/questions/13145368/how-to-find-the-maximum-value-in-a-list-of-tuples
How to find the maximum value in a list of tuples?
I have a list with ~10^6 tuples in it like this: [(101, 153), (255, 827), (361, 961), ...] ^ ^ X Y I want to find the maximum value of the Ys in this list, but also want to know the X ...
stackoverflow.com
다 풀고 다른 사람들 풀이 봤는데 이렇게 풀면 풀린다...................
뭐징??
조건문의 "d and" 이 부분이 중요하다. 난 이 요소를 고려하지않았다..
"d and"는 d 리스트 안에 원소가 없으면 max에서 비교할 원소가 없어 런타임 에러가 나온다 한다.
if de and max(de)[0] > item[0]: 이렇게 적어야만 성공한다
from collections import deque
def solution(priorities, location):
answer = 0
d = deque([(v,i) for i,v in enumerate(priorities)])
while len(d):
item = d.popleft()
if d and max(d)[0] > item[0]:
d.append(item)
else:
answer += 1
if item[1] == location:
break
return answer
'코딩 테스트 > Programmers' 카테고리의 다른 글
[Python] [Level 2] 피로도 (완전 탐색) (itertools 라이브러리permutation 순열로 풀기) (0) | 2023.03.07 |
---|---|
[Python] [Level 2] 전화번호 목록 (Hash 해시 : 파이썬 dictionary 활용하기) (0) | 2023.03.06 |
[Python] [Level 2] [1차] 뉴스 클러스터링 (feat. 다중 집합의 교집합, 합집합) (isalpha() 함수 이용하기) (0) | 2023.03.02 |
[Python] [Level 2] 해시 위장 (Hash, Dictionary) ...Hash Table 처럼 풀기! (0) | 2023.03.01 |
[Python] [Level 2] 기능 개발 (0) | 2022.11.05 |