알고리즘 문제풀이

[프로그래머스] 프로세스 (Swift)

SiO2whocode 2024. 10. 18. 17:29
728x90

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

 

프로그래머스

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

programmers.co.kr

 

 

스택/큐 (Queue)

N개의 프로세스에 대해 우선순위를 나타낸 배열이 하나 주어지고

처음부터 프로세스를 보면서 우선순위가 더 높은 게 뒤에 있을 경우 큐의 맨 뒤로 보내는 식으로

프로세스를 실행할 때, 특정 프로세스의 위치(인덱스)를 입력받아 해당 프로세스가 몇번째로 실행되는지 반환하라는 문제

 

접근방법

스위프트는 Queue가 collection에 없기 때문에 array를 사용해서 dequeue은 removeFirst를 쓰고 enqueue는 append를 써서 풀었다.

1) 우선 (idx(location), priority) 튜플을 원소로 갖는 배열(q)을 하나 만들고,

 2) 이 배열이 빌때까지 반복문을 돌면서, 맨 앞에 있는 프로세스가 지금 실행될 수 있는지 없는지 판단하고,

2-1) 실행될 수 있으면 exe라는 딕셔너리에 key: idx(location), value: cnt(실행되는 순서)를 넣는다. (*cnt는 q를 순회하는 반복문 전에 1로 초기화해두고 프로세스가 실행될 때 마다 증가시킨다.)

2-2) 실행될 수 없으면, 다시 q에 append한다.

3) exe 딕셔너리에서 location을 key로 갖는 value를 리턴한다.

 

소스코드

import Foundation

func solution(_ priorities:[Int], _ location:Int) -> Int {
    
    var q:[(Int, Int)] = []
    
    for (i,process) in priorities.enumerated() {
        q.append((i,process))
    }
    
    var exe:[Int:Int] = [:] // 실행 순서 [idx:cnt]
    
    var cnt = 1
    while !q.isEmpty {
        var first = q[0]
        q.removeFirst()
        var canExe = true
        for process in q {
            if first.1 < process.1 {
                q.append(first)
                canExe = false
                break
            }
        }
        // 실행
        if canExe {
            exe[first.0] = cnt
            cnt += 1
        }
    }
    
    return exe[location] ?? 0
}

 

728x90