요구능력
큐에대한 이해
문제풀이
1. 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다.
2. 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에 넣습니다.
3. 그렇지 않으면 J를 인쇄합니다.
위의 문제의 조건을 보면 맨앞에서 꺼내서 맨뒤로 넣는다.
전형적인 큐를 이야기 하고있다.
나의 경우 귀찮아서 문제를 지저분하게 풀었지만 튜플을 이용해서 큐를 사용하면 더욱 깔끔하게 문제를 해결 할 수 있다.
ABCD를 넣어서 푸는사람도 있겠지만 이 역시 귀찮아서 identy배열에 0부터 queue의 개수만큼 넣어줘서 고유한 숫자로 적용해줬다.
priorities가 [2, 1, 3, 2]라면 identy는 ["0", "1", "2", "3"]이렇게 ["A","B","C","D"]대신 넣어준것이다.
요청한 문서가 몇번째로 인쇄되는지 구해야되기 때문에 이렇게 고유한값이 필요하다.
그리고 큐가 비어있지않으면 맨앞에있는 원소보다 뒤에 우선순위가 큰게있는지 확인해주고 우선순위가 큰게 있다면 현재 원소를 맨뒤로 보내준다. 이때 identy도 같이해준다. 이유는 고유한 값이 우선순위랑 묶여있어야 되기때문이다.
그리고 맨뒤로 가게됬을경우 반복을 멈춰준다.
check 변수를 사용해서 맨 뒤로 안가게됬을경우에는 그게 최우선순위이므로 큐에서 제거해주고 identy에서 제거해주는데 만약 내가 찾던 identy라면 모든걸 그만두고 결과값을 리턴해준다.
후기
어렵지않은 브루트포스에 큐를 곁들인문제
코드
func solution(_ priorities:[Int], _ location:Int) -> Int {
var result = 0
var queue = priorities
var identy = [String]()
for i in 0..<queue.count{
identy.append("\(i)")
}
let wantFind = identy[location]
var count = 0
while !queue.isEmpty{
//뒤로갔는지 체크
var check = false
for j in stride(from: 1, to: queue.count, by: 1){
if queue[0] < queue[j]{
let a = queue.removeFirst()
queue.append(a)
let b = identy.removeFirst()
identy.append(b)
check = true
//뒤로 갔으면 더이상 반복할 필요 없음
break
}
}
//뒤로가지 않았으면 자기자신이 최우선순위
if !check{
count += 1
queue.removeFirst()
let c = identy.removeFirst()
if c == wantFind {
result = count
break
}
}
}
return result
}
'Algorithm > 문제풀이_프로그래머스' 카테고리의 다른 글
[Swift][프로그래머스][정렬] K번째수 (0) | 2022.04.13 |
---|---|
[Swift][프로그래머스][Queue] 다리를 지나는 트럭 (0) | 2022.04.12 |
[Swift][Programmers][고득점Kit] 기능개발 (0) | 2022.04.12 |
[Swift][프로그래머스][DFS] 타겟 넘버 (0) | 2022.03.14 |
[Swift][백트래킹][LV_3] 양과 늑대 (0) | 2022.02.26 |
댓글