반응형
프로그래머스 문제를 풀었다.
https://programmers.co.kr/learn/courses/30/lessons/42587
결론적으로 내가 작성한 코드는 아래와 같다
from typing import Any, Sequence
from collections import deque
from random import randint
class PriorityPrint(object):
def __init__(self,seq,location):
self.location = location
self.max = max(seq)
self.seq = deque(seq,len(seq))
self.key = self.seq[location]
def enque(self,value):
self.seq.append(value)
def dque(self):
return self.seq.popleft()
def passToNext(self):
self.enque(self.dque())
def returnLocationIndex(self,count):
# Get location of the key
if self.location - count >= 0:
return self.location - count
else:
return len(self.seq) - (count - self.location)
def main(self):
loop = True
count = 0 # Count of Index Movement
printedCount = 0
while self.max != self.key:
if self.max == self.seq[0]:
self.location = self.returnLocationIndex(count)
count = 0
self.dque()
self.location -= 1
self.max = max(self.seq)
printedCount += 1
else:
self.passToNext()
count += 1
self.location = self.returnLocationIndex(count)
#여기까지 해서 max가 key값과 같아질때로 만든다.
count2 = 0
samepriority = 0
while self.returnLocationIndex(count2) != 0:
if self.max == self.seq[0]:
self.location = self.returnLocationIndex(count2)
count2 = 0
self.dque()
self.location -= 1
samepriority += 1
else:
self.passToNext()
count2 += 1
return printedCount + samepriority + 1
def solution(priorities : Sequence, location : int) -> int:
pq = PriorityPrint(priorities,location)
return pq.main()
결론을 말하면 맞긴 했지만 작성하면서 뭔가 너무 길고 이상하게 작성했다는 생각이 많이 들었다. 그래서 다른 분들의 풀이를 보던 도중 흥미로운 코드가 있었다
def solution(priorities, location):
queue = [(i,p) for i,p in enumerate(priorities)]
answer = 0
while True:
cur = queue.pop(0)
if any(cur[1] < q[1] for q in queue):
queue.append(cur)
else:
answer += 1
if cur[0] == location:
return answer
되게 간단 명료했던 코드였다. 그중 생소했던 any() 기본 내장 메소드에 대해서 찾아보았는데, any()와 상반 개념으로 쓰이는 메소드로 all()이라는 내장 메소드가 있다. 이 두 내장 메소드는 모두 iterable한 객체를 매개변수로 받게 된다. 이 메소드는 매개변수로 받은 객체를 돌면서 검사하고 답을 True 혹은 False로 반환하게 된다. 이 두 내장 메소드의 역할은 각각 아래와 같다.
- any() : 하나의 조건이라도 True가 있는 경우 True를 반환한다.
- all() : 모두 True여야 True반환
다르게 생각하면 any()는 or연산자, all()은 and 연산자라고 할 수 있는것이다.
이제 이 코드를 내꺼로 만들어 보기 위해 다시 작성했다. 다른 분의 코드에서 조금 더 개선을 하자면, list.pop(0)연산 같은 경우에는 O(n)의 시간복잡도를 가지게 된다. 그렇기 때문에, 매개변수로 받은 리스트를 이용해 collections의 deque() 로 선언해 주고, pop(0)대신 popleft()로 대체하여 코드를 작성하였다.
from collections import deque
def solution(priorities,location):
que = deque([(i,p) for i,p in enumerate(priorities)], len(priorities))
answer = 0
while True:
c = que.popleft()
if any(c[1] < q[1] for q in que):
que.append(c)
else:
answer += 1
if c[0] == location:
return answer
반응형
'CS 지식 > Algorithm-이론 및 PS스킬 정리' 카테고리의 다른 글
[자료구조 이론] Stack에 대하여 (0) | 2021.12.29 |
---|---|
버블정렬(Bubble Sort)알고리즘 정리 (0) | 2021.12.14 |
유클리드 호제법을 이용한 최대공약수(GCD) (0) | 2021.01.10 |
이진검색(Binary Search) (0) | 2020.10.10 |
보초법(Sential Method) (0) | 2020.10.09 |