문제 :
https://programmers.co.kr/learn/courses/30/lessons/42587
1. 문제 이해하기
- 대기목록에 있는 문서의 중요도 배열(priorities), 요청한 문서의 현재 위치(location)가 주어졌을 때, 요청한 문서가 몇 번째로 인쇄되는지 구하기
- 대기목록 배열 크기 1 이상 100 이하
- 인쇄 작업의 중요도는 1 ~ 9이며 클수록 중요하다.
2. 문제 풀이 생각하기
- 처음에는 문서의 위치와 우선순위를 해시 테이블로 만드려고 했었는데, 해시는 순서가 없고, 배열에서 원소를 지우고 더하고를 반복하기 때문에 해시를 쓸 이유가 없다고 생각했습니다.
- 대기목록이 총 100개밖에 되지 않기 때문에 remove, append를 반복해도 시간 초과가 발생하지 않을 것이라고 생각했습니다.
- 요청한 문서의 현재 위치를 계속 갱신시켜야 한다고 생각했습니다.
- 요청한 문서의 현재 위치(now), 상수 priorities를 변수로 만든 prior, 총 횟수(ans)를 생성
- 현재의 위치에서 -1이 되면(0보다 작아지면) 요청한 문서가 출력될 수 있도록 while문 생성
- 대기열의 첫 번째 문서가 우선순위가 가장 큰 지를 판별합니다.
- 우선순위가 가장 크거나 같으면, remove 후, ans += 1, now -= 1
- 우선순위가 가장 크지 않으면, 요청한 문서의 위치(now)가 0인지 확인하고 0이면 now = 배열의 크기 - 1, 0이 아니면 now = now - 1 (요청한 문서가 가장 첫 번째에 있더라도 출력하면 안 되므로)
- 그리고 첫 번째 문서를 가장 뒤로 보내기
- 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 |