-
[프로그래머스 Lv.2] 프린터 풀이 및 해설 feat. Swift프로그래머스/Lv.2 2022. 7. 9. 13:39반응형
안녕하세요:)
레인스톤입니다.
오늘은 프로그래머스 Lv.2 프린터 문제
swift 풀이를 살펴보겠습니다.문제 설명
현재 대기목록에 있는 문서의 중요도가 순서대로 담긴 배열 priorities와
내가 인쇄를 요청한 문서가 현재 대기목록의 어떤 위치에 있는지를 알려주는 location이 매개변수로 주어질 때,
내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는지 return 하도록 solution 함수를 작성해주세요.- 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다.
- 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 있으면 J를 대기목록의 가장 마지막에 넣습니다.
- 그렇지 않으면 J를 인쇄합니다.
제한사항
- 현재 대기목록에는 1개 이상 100개 이하의 문서가 있습니다.
- 인쇄 작업의 중요도는 1~9로 표현하며 숫자가 클수록 중요하다는 뜻입니다.
- location은 0 이상 (현재 대기목록에 있는 작업의 수 - 1) 이하의 값을 가지며 대기목록에 가장 앞에 있으면 0, 두 번째에 있으면 1로 표현합니다.
제한 사항 분석
- 배열이 빈 경우에 대한 예외처리 필요 없음
- 인쇄 작업의 중요도는 숫자가 클수록 중요도가 높음
- location은 배열의 index와 동일하게 처리
- 1개 ~ 100개이기 때문에 시간 복잡도의 중요도가 낮음
풀이 기획
문제에서 시키는 그대로 구현하면 됩니다.
불필요한 추측과 생각은 잠시 접어두시고,
문제에서 시키는 대로 구현하는 연습을 해주세요.- priorities에서 가장 앞에 있는 element(J)를 빼냅니다.
- J보다 중요도가 높은 element가 priorities에 있는지 탐색합니다.
- J보다 중요도가 높은 element가 있다면 priorities에 append(가장 마지막에 넣어주기)합니다.
- 없다면
- location과 J의 처음 위치를 비교해서 같지 않을 경우 다음 element를 1번부터 반복합니다.
- location과 J의 처음 위치를 비교해서 같을 경우 기존 priorities의 수에서 element가 빠진 배열의 수를 빼서 return합니다.
priorities에서 element가 빠진 배열의 수를 빼서 return하는 게 왜 정답일까요?
예를 들어 보겠습니다.
[2, 1, 3, 2] 배열이 priorities로 주어졌습니다.
2를 빼내서 [1, 3, 2] 배열과 비교합니다.
3이 더 크기 때문에 2를 append합니다.
[1, 3, 2, 2]
1을 빼내서 [3, 2, 2] 배열과 비교합니다.
3이 더 크기 때문에 1을 append합니다.
[3, 2, 2, 1]
3을 빼내서 [2, 2, 1] 배열과 비교합니다.
3보다 큰 element가 없습니다.
3의 처음 위치는 2, 주어진 location도 2입니다.
이때 처음 주어진 priorities의 count 4이고
3이 빠진 배열의 count는 3입니다.
(4 - 3)은 1입니다.
즉, 3은 첫 번째로 출력되는 값이됩니다.
(4 - 3)의 값인 1을 return해줍니다.
이해가 어렵다면 임의의 배열을 만들어서 위 과정을 반복해보세요 :)풀이 과정
var priority = priorities.enumerated().map {($0.offset, $0.element)} var res = 0
먼저 중요도와 인덱스를 매칭 시켜야합니다.
예를 들어 [2, 1, 3, 2]와 같이 priorities가 주어진다면,
[(0, 2), (1, 1), (2, 3), (3, 2)]와 같이 mapping해주는 작업입니다.
location과 priorities의 각 element의 위치를 비교해야하기 때문에 필요한 코드입니다.
location으로 2가 주어지면 2의 위치에 있는 3(2, 3)이 몇 번째로 출력 되는지를 retrun해야 하니까요.let head = priority.remove(at: 0) if !priority.filter({head.1 < $0.1}).isEmpty { priority.append(head) }
중요도와 인덱스를 매칭시킨 priority배열에서 첫 번째 값을 빼내어 head 상수에 assign해줍니다.
여기서 head는 2가 아니라 (0, 2)입니다. 위에서 인덱스와 매칭시켰던 걸 잊지말아주세요!
그리고 head의 1과 priority배열의 각 element의 1을 비교해줍니다.
head.0은 (0, 2)중 0(Index)이며 head.1은(0, 2)중 2(element)입니다.
filter를 활용했기 때문에 priority 배열에 더 큰 값이 없다면 empty가 됩니다.
근데 앞에 !를 붙인게 보이시죠? 즉 isNotEmpty 상황을 가정한 것이라고 이해하면 됩니다.
if 구문을 쉽게 설명하면 head의 element보다 priority 배열이 큰 element를 가지고 있다면? 입니다.
그렇다면 head의 중요도보다 priority 배열의 어떤 element의 중요도가 높다는 의미이기 때문에
"나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 있으면 J를 대기목록의 가장 마지막에 넣습니다."
라는 룰에 따라서 대기목록(priority)의 가장 마지막에 넣어(append)줍니다.else if head.0 == location { res = priorities.count - priority.count break }
하지만 if 구문이 empty라면?
즉, head의 element가 priority 배열의 element들 보다 크다면?
location과 위치가 같은지를 비교해줍니다.
우리가 원하는 값은 location과 같은 위치에 있던 element이기 때문입니다.
location과 같은 위치에 있다면 res 변수에 처음 주어졌던 배열의 count에서 현재 배열의 count를 빼준 값을 assign합니다.while true { }
그리고 한 번에 답을 찾지 못할 수 있기 때문에 이 과정을 반복해줍니다.
head의 element가 가장 크지만 location과 위치가 다르다면 다음 head를 찾아 코드가 반복이 되겠죠?전체 코드
func solution(_ priorities:[Int], _ location:Int) -> Int { var priority = priorities.enumerated().map {($0.offset, $0.element)} var res = 0 while true { let head = priority.remove(at: 0) if !priority.filter({head.1 < $0.1}).isEmpty { priority.append(head) } else if head.0 == location { res = priorities.count - priority.count break } } return res }
반응형'프로그래머스 > Lv.2' 카테고리의 다른 글
[프로그래머스 Lv.2] 방문길이 풀이 및 해설 feat. Swift (0) 2022.07.15