programmers.co.kr/learn/courses/30/lessons/42587

 

코딩테스트 연습 - 프린터

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

programmers.co.kr

이번 문제는 배열이 주어지고 정렬하는 문제로 보았다.

 

실 답을 구하려면 굳이 id를 정하고 정렬할 필요는 없어 보이지만 

실제 프린터라고 생각해서 하나의 작업에 대해 id를 각각 추가하여 작성해봤다.

 

정렬 순서는 문제에서 제시해준 3단계를 그대로 따라하면 간단히 된다.

 

난 총 세부분으로 소스를 나눠 작성했다

 

첫번째 - 주어진 priorities에 각각 id를 지정

두번째 - priorities를 정렬(

문제에서 주어짐, 첫번째 목록의 우선순위가 대기중인 작업의 우선순위보다 낮다면 무조건 대기순위 뒤로 이동 

대기중인 작업중 우선 순위가 더 큰게 없다면 대기순위에서 제거)

 

세번째 - 찾으려는 타깃이 언제 완료되는가 리턴 

 

 

  struct Work {
    let id:Character
    let priority:Int
  }
  
  func solution(_ priorities:[Int], _ location:Int) -> Int {
    var works = [Work]()
    var endArray = [Work]()
    var lastId:Character = "a"
    for priority in priorities {
      let work = Work(id: lastId, priority: priority)
      lastId = Character(Unicode.Scalar((lastId.unicodeScalars.first!.value) + 1)!)
      works.append(work)
    }

    guard location < works.count else { return -1 }
    let findTarget = works[location]
    
    while works.count > 0 {
      let target = works[0]
      var notFind = true
      for i in 1 ..< works.count {
        // 뒷 대기열에 큰게 있다면 notFind = false
      }
      if notFind {
      // 대기열에서 제거 endArray에 추가
      }
    }

    for i in 0 ..< endArray.count {
    // 찾으려는 id와 같은것의 i값 리턴
    }
    
    return -1
  }

 

 

전체 소스는 아래 깃허브 페이지에 있다.

github.com/wiwi-git/Programmers-learn/blob/master/swift/Practice/Practice/Printer.swift

 

wiwi-git/Programmers-learn

Contribute to wiwi-git/Programmers-learn development by creating an account on GitHub.

github.com

 

programmers.co.kr/learn/courses/30/lessons/42586

 

코딩테스트 연습 - 기능개발

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는

programmers.co.kr

스택/큐 분류에 들어있는 문제다.

 

퍼센트지가 들어있는 배열(progresses)이 각각 루프 1당(문제에서의 하루) speeds 배열의 값 만큼 진행되어서

퍼센트지가 100%로 다 채워졌을때가 몇 루프인지 계산하는 문제이다.

 

계산시에 progresses의 값이 들어있는 순서대로 뒷 값이 작은게 몇개인지 저장하고 그 값을 리턴해주면 된다.

 

나는 우선 퍼센트지가 전부다 찼을때의 루프수를 저장해놓기위해 complete배열을 progresses배열의 수 만큼 작성해두고.

progresses를 foreach문을 통해 

내부에 while문으로 퍼센트치를 채워넣으면서 루프수(foreach문안의 변수 day)를 저장했다

 

그후 while문을 통해 complete배열이 앞값과 뒷값을 비교해가며 뒷값이 작을때 +1 뒷값이 클때 다시1 부터 카운트식으로 하여 코드를 짯다.

 

총 두 두분으로 나눠서 했다.

 

    var complete = Array<Int>(repeating: 0, count: progresses.count)
    
    for (i, persent) in progresses.enumerated() {
      var day = 0
      var persent = persent
      while persent < 100 {
        persent += speeds[i]
        day += 1
      }
      complete[i] = day
    }
    
    var i = 0
    var result = [Int]()
    while i < complete.count {
      var commit = 1
      if (i + 1) >= complete.count {
        result.append(commit)
        break
      }
      
      for k in (i + 1) ..< complete.count {
        if complete[i] >= complete[k] {
          commit += 1
        } else { break }
      }
      
      i += commit
      result.append(commit)
    }
    return result

라인 자체는 적어보이는데 두 번째 루프문부분, 값비교하는 부분이 뭔가 찝찝하다 

하지만 채점결과는 통과하니 그냥 넘어가련다. 생각하기 귀찮아졌다.

 

아래링크는 해당 소스가 올려놓은 깃허브 페이지이다.

 

github.com/wiwi-git/Programmers-learn/blob/master/swift/Practice/Practice/FunctionDevelopment.swift

 

wiwi-git/Programmers-learn

Contribute to wiwi-git/Programmers-learn development by creating an account on GitHub.

github.com

 

programmers.co.kr/learn/courses/30/lessons/42583

 

코딩테스트 연습 - 다리를 지나는 트럭

트럭 여러 대가 강을 가로지르는 일 차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 트럭은 1초에 1만큼 움직이며, 다리 길이

programmers.co.kr

문제에 테스트케이스가 다양하게 안되있었으면 뭐가 틀렸는지 모르고 끙끙 거렸을거같네요.

 

이번 문제는 큐는 어떻게 동작하는가에 대한 문제입니다.

스위프트에는 스택과 큐를 따로 자료형으로 정의되어 있지 않는걸로 알기에 따로 구현을 해서 할까 하다가 그냥 진행했습니다.

문제는 별 이상없이 이해가 되는데 문제에 제시된 예시용 표때문에 이게 무슨소리인가 난감해졌었습니다.

문제의 표처럼 하지말고

아래 처럼 하는게 문제 이해가 쉽습니다

 

지나는중의 숫자 뒤의 괄호는 현재 지나는 정도를 나타내봤습니다

문제에 제시된 다리길이가 10일경우 괄호의 수가 10이 되야 지난 트럭에 들어갑니다.

아래표는 다리 길이가 2이고 최대하중에 10입니다. 지난 트럭은 안적었습니다.

시간 대기중 지나는중
0 7 4 5 6  
1 4 5 6 7(0)
2 4 5 6 7(1)
3 5 6 4(0)
4 6 4(1) 5(0)
5 6 5(1)
6   6(0)
7   6(1)

 

계속 루프 해주면서 대기중에 있는 애가 지나는중 배열에 들어갈 수 있는가를 체크하고

지나는중의 배열에 있는 애는 다 지나갔는지 체크해주면 됩니다.

 

  struct Truck {
    let weight:Int
    var position:Int = 0
  }
  
  func solution(_ bridge_length:Int, _ weight:Int, _ truck_weights:[Int]) -> Int {
    func totalTruckWeight(truckArray:[Truck]) -> Int {
      var result = 0
      for item in truckArray {
        result += item.weight
      }
      return result
    }
    
    var passingArray = [Truck]() // 지나는 도중인 트럭을 저장할 배열
    var endArray = [Truck]() // 도착한 트럭을 저장할 배열
    var truckArray = [Truck]()  // 모든 트럭을 넣어둘 배열 
    
    // 매개변수로 받은 애들 Truck구조체 형태로 변경해주기
    
    var waitArray:[Truck] = truckArray // 대기중인 트럭을 넣어두는 배열
    var time = 0 // 반환할 값, 전체 지난 시간
    
    while endArray.count < truckArray.count {
      if passingArray.count > 0 {
      	// 트럭들 포지션 변화
		// 도착한애들 빼주기
      }
      if waitArray.count > 0 {
        // 대기 중인 애들 다리에 올리기 
      }
      time += 1
    }
    return time
  }

 

 

전체 소스는 아래 링크에 있습니다.

github.com/wiwi-git/Programmers-learn/blob/master/swift/Practice/Practice/TruckPassingBridge.swift

 

wiwi-git/Programmers-learn

Contribute to wiwi-git/Programmers-learn development by creating an account on GitHub.

github.com

 

+ Recent posts