Algorithm/Swift

[Programmers] 프린터 (Swift)

Minny27 2021. 7. 26. 14:33

문제 : 

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

 

코딩테스트 연습 - 프린터

일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린

programmers.co.kr

 

1. 문제 이해하기

  • 대기목록에 있는 문서의 중요도 배열(priorities), 요청한 문서의 현재 위치(location)가 주어졌을 때, 요청한 문서가 몇 번째로 인쇄되는지 구하기
  • 대기목록 배열 크기 1 이상 100 이하
  • 인쇄 작업의 중요도는 1 ~ 9이며 클수록 중요하다.

 

2. 문제 풀이 생각하기

  1. 처음에는 문서의 위치와 우선순위를 해시 테이블로 만드려고 했었는데, 해시는 순서가 없고, 배열에서 원소를 지우고 더하고를 반복하기 때문에 해시를 쓸 이유가 없다고 생각했습니다.
  2. 대기목록이 총 100개밖에 되지 않기 때문에 remove, append를 반복해도 시간 초과가 발생하지 않을 것이라고 생각했습니다.
  3. 요청한 문서의 현재 위치를 계속 갱신시켜야 한다고 생각했습니다.
  4. 요청한 문서의 현재 위치(now), 상수 priorities를 변수로 만든 prior, 총 횟수(ans)를 생성
  5. 현재의 위치에서 -1이 되면(0보다 작아지면) 요청한 문서가 출력될 수 있도록 while문 생성
  6. 대기열의 첫 번째 문서가 우선순위가 가장 큰 지를 판별합니다.
  7. 우선순위가 가장 크거나 같으면, remove 후, ans += 1, now -= 1
  8. 우선순위가 가장 크지 않으면, 요청한 문서의 위치(now)가 0인지 확인하고 0이면 now = 배열의 크기 - 1, 0이 아니면 now = now - 1 (요청한 문서가 가장 첫 번째에 있더라도 출력하면 안 되므로)
  9. 그리고 첫 번째 문서를 가장 뒤로 보내기
  10. 6 ~ 9 반복

 

3. 차근차근 구현하기

 

import Foundation

func solution(_ priorities:[Int], _ location:Int) -> Int {
    var ans = 0
    var prior = priorities // let -> var
    var now = location // 요청한 문서의 현재 위치
    while now >= 0 {
        var maxValue = 0
        for i in 0..<prior.count {
            maxValue = maxValue < prior[i] ? prior[i] : maxValue
        }   
        // 대기열의 첫 번째 인쇄물의 우선순위가 가장 높을 때
        if prior[0] >= maxValue {
            prior.removeFirst()
            ans += 1
            now -= 1
        }
        // 그렇지 않을 때
        else {
            now =  now == 0 ? prior.count - 1 : now - 1
            prior.append(prior.removeFirst())
        }
    }
    return ans
}

 

4. 피드백

  • 나름 빠르게 풀었던 것 같습니다.

'Algorithm > Swift' 카테고리의 다른 글

[백준 14503] 로봇 청소기 (Swift)  (0) 2021.08.05
[백준 3184] 양 (Swift)  (0) 2021.08.04
[Programmer] 짝지어 제거하기 (Swift)  (0) 2021.07.16
[백준 1806] 부분합 (Swift)  (0) 2021.07.15
[Programmers] 오픈채팅방 (Swift)  (0) 2021.07.13