프로그래머스

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

띵지니어 2024. 6. 30. 23:39

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

 

프로그래머스

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

programmers.co.kr

 

내 코드

func solution(_ priorities: [Int], _ location: Int) -> Int {
    
    var result: [(Int, Int)] = []
    var tuple = priorities.enumerated().map { ($0.offset, $0.element) }  // (0, 2) (1, 1) (2, 3) (3, 2)
    
    while !tuple.isEmpty {
        
        var maxValue = tuple.max(by: { $0.1 < $1.1 })!.1 // whlie 조건에서 항상 하나 이상의 값을 가짐
        
        if let first = tuple.first?.1, first == maxValue {
            result.append(tuple.removeFirst())
        } else {
            tuple.append(tuple.removeFirst())
        }
    }
    
    return (result.enumerated().first(where: { $0.element.0 == location })?.offset ?? 0) + 1
}

Review

문제 접근 방식은

1. index와 priorities 를 튜플로 하는 리스트를 만듭니다.
2. priorities 에서 가장 큰 값을 체크하고 저장합니다.
3. 맨 앞 원소가 가장 큰 원소 인지 비교하고 가장 큰 원소면 대기열 맨 앞에서 제거하고, 그 값을 result에 넣어 줍니다.
4. 맨 앞 원소가 가장 큰 원소가 아니라면 대기열 끝에 다시 넣어 줍니다.
5. 3번 4번을 대기열이 빌 때까지 반복해 줍니다.
6. 프로세스가 들어온 결괏값(result)에 튜플의 0번 원소(index)를 location과 비교해서 몇 번째에 위치해 있는지 확인해 줍니다.
 6-1. 결과에 +1 을 해준 이유는 index는 0 부터 시작하기 때문에 + 1 을 해주었습니다.

 

튜플을 사용한 이유는 해당 프로세스가 처음에 몇 번째에 위치해 있었는지 저장하고,
이후에 결과(result) 안에서 location에 위치해 있는 프로세스가 어디에 있는지 구분하기 위함입니다.

손 글씨로 해당 문제를 풀어보면 아래와 같습니다