TIL/알고리즘 공부

프로그래머스 Lv. 2 Swift 알고리즘 - 프린터

여의도사노비 2023. 1. 9. 11:38
728x90

그 전에 풀었던 LV2 문제 기능개발과 비슷한 맥락의 문제다.

스택/큐를 활용하는 문제이고 난이도는 그렇게 높지 않았다.

 

우선순위가 높은 작업이 있다면 그 작업을 가장 앞으로 옮기고 그 과정에서 앞에 있던 원소들은 전부 뒤로 순차적으로 보낸다.

이때 중요한 것은 처음에 주어진 location에 위치해있던 원소가 어디로 가는지 동선을 따라가는 것이다.

 

 

 

이 문제를 풀면서 생각한 논리적 흐름

  1. 처음 위치하고 있는 원소가 그 배열의 가장 큰 값이라면 값을 지우고(프린트 완료) ans에 1을 추가해준다.(1 cycle이 돌았음)
  2. 그리고 만약 내가 궁금한 원소의 순서가 0의 값을 갖으면(맨 앞에 위치) while문을 빠져나간다.
  3. 그게 아니라면 앞의 First값이 사라졌으니 앞으로 한칸 땡긴다.(idx -= 1)
  4. 처음 위치해 있는 값이 제일 큰 값이 아니라면 그 값을 지우고 맨 뒤에 다시 추가해준다.(배열의 맨 끝으로 보냄)
  5. 원소의 당시 위치(idx)를 최신화해주고 다시 위의 과정을 반복해서 한 칸씩 앞으로 밀어준다.

 

 

* 코드

func solution(_ priorities:[Int], _ location:Int) -> Int {
  var arr = priorities
  var idx = location
  var ans = 0

  while true {
    if arr.first! == arr.max() {
      arr.removeFirst()
      ans += 1

      if idx == 0 {
        break
      } else {
        idx -= 1
      }

    } else {
      let temp = arr.removeFirst()
      arr.append(temp)

      if idx == 0 {
        idx = arr.count - 1
      } else {
        idx -= 1
      }
    }
  }
  return ans
}

 

 
 

정리(Today I Learned)

  1. 없음