프로그래밍/Algorithm

프로그래머스 - 프로세스

모지사바하 2024. 3. 19. 15:10

https://school.programmers.co.kr/learn/courses/30/lessons/42587

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

쉽게 생각했다가 큰 코 다쳤다.

 

나는 처음에 아래와 같은 방식으로 문제를 풀려고 시도 했다.

 

1. priorities[location] 보다 우선순위가 큰수만 필터링: 우선순위가 큰 순으로 정렬: bigger

2. priorities[location] 과 같은수만 필터링: 인덱스 번호가 작은 순으로 정렬: eq

3. priorities[location] 보다 우선순위가 큰수만큼  ans 에 더함

4. eq 를 순회하며 location과 같은 index 를 만날때까지 ans+1

5. location과 같은 index 를 만나면 ans return

 

위와 같은 방법으로 계속 틀렸고, 우선순위가 큰 수의 마지막 index 보다 location이 작은 경우에 대한 추가 처리를 작성하다가 코드가 너무 복잡해지고 잘못된 방향으로 가고 있다는 생각이 들어서 다른사람의 풀이 를 보고 힌트를 얻어 아래와 같이 문제를 해결하였다.

 

from collections import deque


def solution(priorities, location):
    ans = 0
    d = deque([(i, v) for i, v in enumerate(priorities)])
    while True:
        i, v = d.popleft()
        if any(v < q[1] for q in d):
            d.append((i, v))
        else:
            ans += 1
            if i == location:
                return ans

 

 

1. 값과 인덱스를 갖고 있는 deque를 생성한다.

2. deque 의 첫번째 요소를 꺼낸 후, deque 의 나머지 요소중 우선순위가 더 높은게 있는지 검사한다.

3. 우선순위가 더 높은게 있다면 deque의 마지막으로 해당 작업을 추가한다

4. 우선순위가 높은게 없다면 처리대상이므로 결과값에 1을 더한후, 현재 처리한 값의 인덱스가 location과 일치하는지 검사한다.

5. 일치한다면 location 의 프로세스를 수행한 것이므로, ans 를 리턴한다.

 

 

소감: 한동안 알고리즘을 안 풀었더니 머리가 굳어버린듯하다. 앞으로는 아무리 시간이 없더라도 왠만하면 하루에 한 문제씩은 풀어야겠다.