[깃허브]
[프로그래머스]
https://school.programmers.co.kr/learn/courses/30/lessons/42583
아... 정말 테스트케이스를 다 틀리면 완전 갈아엎어서 다시 진행할텐데 1~2개만 틀렸을 때는 그게 쉽게 안 된다.
이번 문제가 진짜 그랬다.
그래서 뭐가 문제이고 어떤 케이스가 문제가 나는건가 고민하고 수정하는데만 1시간은 쓴 거 같다...
해결해서 정말 후련하면서도 완전히 그 반례를 찾아내지 못한 거에 대해서는 아쉬움이 남는다.
문제를 처음 보고는 문제 참 비문학처럼 썼다는 생각이 들었다.
예제를 보고 이해하는데 상당히 머리를 써야했기 때문이다.
그 과정을 잘 거치고 나서는 큐를 써야겠다는 생각이 들었고 그래서 LinkedList 자료형을 사용했다.
이 외에 필요한 변수들을 세팅하고 코드 작성을 들어갔다.
처음에는 Pair를 사용해서 다리에 들어간 트럭의 무게와 현재 위치를 저장하려고 했는데 Pair의 값들은 val 타입이라 추가 연산이 되지 않더라...
그래서 data class를 하나 만들어서 연산이 가능한 var타입으로 설정했다.
그렇게 쭉쭉 작성하고 제출했는데... 테스트 케이스 2개가 실패했다.
'반례가 뭐가 있지?' 하며 열심히 뒤져가며 반례를 찾아서 넣어보는데 다 맞다...?!?!
어째서 이런 일이... 그러면 도대체 어디가, 어떻게 잘 못 된거지?
어지러웠다.
한 30분이 지났나? 도움을 받고자 다른 사람들의 코드를 참고하는데 내가 봤던 코드들은 내가 푼 방식하고는 차이가 명확하더라
봤던 코드들은 트럭이 지나갈 때 무게제한이 걸려서 다음 트럭이 오지 못하면 의미없는 값을 채워넣는 방식이고 나는 트럭이 지나갈 때 각자의 현재 위치값을 가지고 있어서 시간이 지날 때마다 현재 위치값을 갱신시켜줬기 때문에 의미없는 값을 채워넣을 필요가 없는 방식이었다.
'음... 내가 해결해야겠구나.' 라는 생각이 들어 이제는 그냥 코박고 계속 시간을 들였다.
그러다 '정말 문제 그대로 실행되게 순서를 짜보자..!'라는 생각이 들었다.
왜냐하면 나는 먼저 들어갈 트럭이 있으면 들어가고 아니면 트럭을 내보내면서 들어갈 트럭을 다시 검사하는 방식이었기 때문에 문제 그대로의 흐름이 아니었다.
그래서 먼저 나갈 트럭이 있는지 확인하고 그 다음에 들어갈 트럭을 확인해서 넣어줬다.(순서 뒤집기)
이외의 변경한 것은 없었다.
아! 나갈 트럭을 검사하는 조건문에서 맨 앞에 있는 트럭의 현재 위치값을 이전에는 다리 길이보다 클 때로 했었는데 같을 때로 변경하기는 했다.
이 부분은 문제 그대로 실행되도록 하기 위해서 변경한 부분이다.
이전에는 들어가야할 시간에 들어가지 않고 한 템포 늦게 들어갔었다.
그래서 시간이 지연되는 문제가 있기도 했었다.
뒤에서 또 같은 조건문을 사용하는 데 거기에는 클 때로 되어있다.
그 이유는 완전히 나갈 때까지에 대한 흐름이 앞의 반복문과는 다르기 때문이라고 생각했기 때문이다.(사실은 이렇게 할 때 값이 제대로 나오더라...ㅎ)
해당 방법으로 작성한 코드는 다음과 같다.
import java.util.*
class Solution {
fun solution(bridge_length: Int, weight: Int, truck_weights: IntArray): Int {
var answer = 0
val position = LinkedList<Pos>()
var currentWeight = weight
var currentLength = bridge_length
var num = 0
// 모든 트럭이 다리에 들어와 바퀴를 붙여봤을 때 탈출
while (num != truck_weights.size) {
// 나갈 트럭
if (position.size != 0) {
if (position[0].second == bridge_length) {
currentLength += 1
currentWeight += position[0].first
position.pollFirst()
}
}
// 남은 트럭
val currentTruck = truck_weights[num]
if (currentWeight >= currentTruck && currentLength > 0) {
position.forEach {
it.second += 1
}
position.add(Pos(currentTruck, 1))
currentWeight -= currentTruck
currentLength -= 1
num++
} else {
position.forEach {
it.second += 1
}
}
answer++
}
// 남은 트럭(뒤에 더 들어올 트럭이 없는 경우)
while (position.size != 0) {
position.forEach {
it.second += 1
}
if (position[0].second > bridge_length) {
currentLength += 1
currentWeight += position[0].first
position.pollFirst()
}
answer++
}
return answer
}
data class Pos(var first:Int, var second: Int)
}
(거의 2시간 넘게 걸렸는데... 그 중에 1시간 반은 단 두 가지의 실패요인을 찾는데 쓴 거 같다..ㅎㅎㅎㅎㅎㅎ)
'Kotlin > Algorithm Problems' 카테고리의 다른 글
<프로그래머스> 소수 찾기(Lv.2) (1) | 2023.12.04 |
---|---|
<프로그래머스> 가장 큰 수(Lv.2) (0) | 2023.12.01 |
<프로그래머스> 2개 이하로 다른 비트(Lv.2) (1) | 2023.11.29 |
<프로그래머스> 숫자 변환하기(Lv.2) (1) | 2023.11.28 |
<프로그래머스> 롤케이크 자르기(Lv.2) (1) | 2023.11.27 |