https://programmers.co.kr/learn/courses/30/lessons/42587?language=swift 

 

코딩테스트 연습 - 프린터

일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린

programmers.co.kr

 

 필수 로직을 한글로 잘 쓰면 어려울 것이 전혀 없었던 문제.

내 로직은 이랬다.

 

일단 priorities가 [Int] 형식인데, 

location 번째를 원한다는 것을 알려주기 위해 다음과 같이 선언하는 것을 전제한다.

    var printers: [(Int, String)] = []
    for (i, e) in priorities.enumerated() {
        if location == i {printers.append((e, "target"))}
        else { printers.append((e, ""))}
    }

 

그리고 구체적으로 다음 로직을 따르면 문제 해결!

// while (true)인 동안.

    // 맨 앞 요소를 봄.
    //    if 맨 앞이 가장 크지 않음.
    //        맨 앞 요소를 맨 뒤로 보냄.
    //    else
    //        answer에 1을 더하기.
    //        if 타겟을 찾았다면 answer를 리턴.
    //        else 배열에서 하나 지우기.

 

import Foundation

// 해당 인덱스의 요소 오른쪽에 더 큰 값이 없는지 확인.
func isBiggest(_ num: Int, _ printers: [(Int, String)]) -> Bool { 
    var mx = 0
    for (i, e) in printers.enumerated() {
        mx = max(mx, e.0)
    }
    return mx == num ? true : false
}

func solution(_ priorities:[Int], _ location:Int) -> Int {
    var answer = 0
    var printers: [(Int, String)] = []
    for (i, e) in priorities.enumerated() {
        if location == i {printers.append((e, "target"))}
        else { printers.append((e, ""))}
    }
    
    
    while (true) {
      // 맨 앞 요소를 봄.
      //    if 맨 앞이 가장 크지 않음.
      //        맨 앞 요소를 맨 뒤로 보냄.
        if isBiggest(printers.first!.0, printers) == false {
            var t = printers.removeFirst()
            printers.append(t)
        } 
        //    else
        //        answer에 1을 더하기.
        //        if 타겟을 찾았다면 answer를 리턴.
        //        else 배열에서 하나 지우기. 
        else {
            answer += 1
            if printers.first!.1 == "target" {
                return answer
            } else {
                printers.removeFirst()
            }
        }
    }
    
    return answer - 1
}

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기
// custom