[Swift] 프로그래머스 프린터(lv. 2)
1. 문제
https://school.programmers.co.kr/learn/courses/30/lessons/42587
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
2. 접근
우선순위가 가장 높은 것부터 먼저 출력을 하는 신기한 프린터이다.
우선순위가 들어있는 배열이 주어지고, 내가 출력하고자 하는 프린트의 location이 주어진다.
숫자로만 주어진 배열을 가지고 큐를 돌리면 location에 있는 중요도가 제대로 기억되지 않을 수도 있다는 점을 포착하였다. 그래서 똑같은 크기의 배열을 선언하고, 거기에는 문자열을 원소로 하게 하고, location 위치에는 "Target"이라고 정해두었다.
Swift는 배열을 뒤집으면 removeLast()와 insert()를 활용해서 프린트와 같이 사용을 할 수가 있다. 물론 뒤집지 않아도 되지만, 나는 remove(at: )보다(O(N) 시간) removeLast()가 조금 더 빨라서(O(1) 시간)) 뒤집어서 배열을 관리하였다.
아래에서는 characterArray라고 이름을 붙였는데, [1, 1, 9, 1, 1, 1]의 경우 [C, C, Target, C, C, C]처럼 바뀌는 것이다. 이 둘이 동시에 돌아가면서 Target이 나올 때까지 반복문을 돌려주는 것이다.
i의 경우, 빠진 원소들의 수를 저장하고 있는 것이고, 만약 반복문이 종료된다면 location에 있는 원소가 빠질 때 몇 번째로 빠졌는지를 알 수 있는 지표라고 할 수 있다. 따라서 마지막에는 i를 리턴해주었다.
3. 코드
import Foundation
func solution(_ priorities:[Int], _ location:Int) -> Int {
var priorArray = Array(priorities.reversed())
var charcterArray = Array(repeatElement("C", count: priorities.count))
charcterArray[location] = "Target"
var reverseCharArray = Array(charcterArray.reversed())
var i = 0
while true {
if priorArray.last == priorArray.max() {
i += 1
if reverseCharArray.last == "Target" {
break
}
priorArray.removeLast()
reverseCharArray.removeLast()
} else {
priorArray.insert(priorArray.popLast()!, at: 0)
reverseCharArray.insert(reverseCharArray.popLast()!, at: 0)
}
}
return i
}
'Problem Solving' 카테고리의 다른 글
[Swift] 프로그래머스 귤 고르기(lv. 2) (0) | 2023.03.29 |
---|---|
[Swift] 프로그래머스 [1차] 뉴스 클러스터링(lv. 2) (0) | 2023.03.28 |
[Swift] 프로그래머스 주차 요금 계산(lv. 2) (0) | 2023.03.25 |
[Swift] 프로그래머스 기능개발(lv. 2) (0) | 2023.03.24 |
[Swift] 프로그래머스 튜플(lv. 2) (0) | 2023.03.23 |
댓글