일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 막내의막무가내
- 안드로이드 sunflower
- 막내의막무가내 안드로이드 코틀린
- 막내의 막무가내
- 막내의막무가내 안드로이드 에러 해결
- 안드로이드
- 주택가 잠실새내
- 막내의막무가내 rxjava
- 막내의막무가내 SQL
- 막내의막무가내 알고리즘
- 막내의 막무가내 알고리즘
- 부스트코스에이스
- 막내의막무가내 목표 및 회고
- 막내의막무가내 일상
- 부스트코스
- 2022년 6월 일상
- 막무가내
- 프로그래머스 알고리즘
- 막내의막무가내 코틀린 안드로이드
- 주엽역 생활맥주
- flutter network call
- 막내의막무가내 프로그래밍
- 안드로이드 Sunflower 스터디
- 프래그먼트
- Fragment
- 막내의막무가내 플러터 flutter
- 막내의막무가내 플러터
- 막내의막무가내 코볼 COBOL
- 막내의막무가내 코틀린
- 막내의막무가내 안드로이드
- Today
- Total
막내의 막무가내 프로그래밍 & 일상
[알고리즘][코틀린] 프로그래머스 다리를 지나는 트럭 -스택, 큐- 본문
https://programmers.co.kr/learn/courses/30/lessons/42583?language=kotlin#
프로그래머스의 다리를 지나는 트럭문제를 코틀린으로 풀어보았다.
내가 알고리즘 초보라 그런거겠지만 레벨2 문제인데 쉽게 풀리지는 않았다. 대기큐에 트럭이 있을 경우 주석 부분을 처음에 while문 가장 앞에서 실행하여 삽질을 했었다.(그럼 로직상 틀려진다.)
그리고 테스트케이스 설명을 보다시피 무게 6짜리가 2 길이의 다리를 건너는데 2가 아니라 3이 걸리는 것을 주의해야한다. 그래서 마지막 결과 time에 +1 을 해주었다.
알고리즘 연습을 많이 해봐야겠다.
(5월에 알고리즘 복습을 하며 다시 풀어봤습니다. 테스트케이스가 추가되었다고 써있고 틀렸다길래 밑에 참고해주세요!)
설명은 주석에 적어놨습니다.
import java.util.*
class Solution {
fun solution(bridge_length: Int, weight: Int, truck_weights: IntArray): Int {
val readyQueue: Queue<Truck> = LinkedList<Truck>() //출발전 대기큐
val onBridgeQueue: Queue<Truck> = LinkedList<Truck>() //다리위 출발큐
var onBridgeTotalTruckWeight = 0 //다리 위 현재 무게
var time = 0
//값 세팅
for (weight in truck_weights) {
readyQueue.offer(Truck(weight, 0))
}
//미리 출발큐에 하나 추가
if(readyQueue.size >= 0) {
onBridgeTotalTruckWeight += readyQueue.peek().weight
onBridgeQueue.offer(readyQueue.poll())
}else{
return 0
}
while (!onBridgeQueue.isEmpty()) {
//다리 위 트럭이동
for (truck2: Truck in onBridgeQueue) {
truck2.postion++
}
//도착한 트럭 빼기
if (onBridgeQueue.peek().postion >= bridge_length) {
onBridgeTotalTruckWeight -= onBridgeQueue.poll().weight
}
//대기큐에 트럭이 있을 경우
if (!readyQueue.isEmpty()) {
// 다리가 무게 견딜수 있는 트럭인 경우 트럭 poll(출발)
if (readyQueue.peek().weight + onBridgeTotalTruckWeight <= weight) {
with(readyQueue.poll()){
onBridgeTotalTruckWeight += this.weight
onBridgeQueue.offer(this)
}
}
}
//총 걸린 시간 증가(결과)
time++
}
return time + 1 //마지막 빠져나오는 시간떄문에 +1
}
//트럭무게, 현재위치
data class Truck(var weight: Int, var postion: Int)
}
[2020-05-08 업데이트]
알고리즘 복습을 하던 도중 2020.04.06 테스트케이스가 추가 되었다는 공지를 보고 다시 실행해봤는데 테스트케이스 4번이 틀렸다고 나왔습니다. 근데 제출하기를 눌렀을 때는 여전히 통과했습니다. 이것도 이상한거지만 무시하고 실행하기의 테스트케이스 4를 위해 문제를 다시 풀어봤습니다.
근데 다시 풀고 예외처리를 해도 테스트케이스 2와 4가 서로 엇갈려서 틀리게 나왔습니다.
계속 해도 안되어서 다시 테스트케이스를 봤는데
보다시피 테스트 케이스 2와 4는 트럭 길이가 하나일 때이며 이때는 당연히 기차 길이의 + 1 만큼의 시간이 답으로 나와야합니다. 그런데 둘은 기댓값부터 다릅니다. 제 생각에는 새로 추가된 테스트케이스가 틀린 것 같아 일단 질문하기에 테스트케이스가 이상한 것 같다고 남긴 상태입니다. 나중에 댓글이 달리면 확인해보도록 하겠습니다.
일단 다음과 같이 풀었습니다.( 이전 코드보다 조금 더 정리됬습니다. 필요없는 코드 삭제)
import java.util.*
class Solution {
fun solution(bridge_length: Int, weight: Int, truck_weights: IntArray): Int {
val readyQueue: Queue<Truck> = LinkedList<Truck>() //트럭 대기큐
val onBridgeQueue: Queue<Truck> = LinkedList<Truck>() //다리위 트럭 출발큐
var onBridgeTotalTruckWeight = 0 //다리 위 현재 무게
var time = 0
//값 세팅
for (weight in truck_weights) {
readyQueue.offer(Truck(weight, 0))
}
while (true) {
//대기큐에 트럭이 있을 경우
if (readyQueue.isNotEmpty()) {
// 다리가 무게 견딜수 있는 트럭인 경우 트럭 poll(출발)
if (readyQueue.peek().weight + onBridgeTotalTruckWeight <= weight) {
with(readyQueue.poll()) {
onBridgeTotalTruckWeight += this.weight
onBridgeQueue.offer(this)
}
}
}
//다리 위 트럭이동
for (truck2: Truck in onBridgeQueue) {
truck2.postion++
}
//도착한 트럭 빼기
if (onBridgeQueue.peek().postion >= bridge_length) {
onBridgeTotalTruckWeight -= onBridgeQueue.poll().weight
}
//총 걸린 시간 증가(결과)
time++
// 다 끝난 경우
if(readyQueue.isEmpty() && onBridgeQueue.isEmpty()){
break
}
}
return time + 1//마지막 빠져나오는 시간떄문에 +1
}
//트럭무게, 현재위치
data class Truck(var weight: Int, var postion: Int)
}
댓글과 공감은 큰 힘이됩니다. 감사합니다.!
'알고리즘 > 스택, 큐' 카테고리의 다른 글
[알고리즘] 백준 9012 괄호 -스택(stack)- 자바 코틀린 (0) | 2020.10.13 |
---|---|
[알고리즘] 프로그래머스 프린터 -큐(queue)- (0) | 2020.06.13 |
[알고리즘] 프로그래머스 쇠막대기 -스택(Stack)- (0) | 2020.05.19 |
[알고리즘] 프로그래머스 짝지어 제거하기 -2017 팁스타운- 스택(Stack) (0) | 2020.05.15 |
[알고리즘] 프로그래머스 주식가격 -스택, 큐- (0) | 2020.03.10 |