나의 풀이
먼저 처음 풀었던 코드이다.
틀린 코드
테스트케이스는 통과하지만 허점이 있다.
일단 가독성이 최악이고 처음 deliveries 배열의 끝에 원소가 0이면 잘못된 답이 출력된다.
그리고 시간초과도 떠서 이렇게 if문으로 풀 수도 있겠지만 엄청 꼼꼼하게 풀어야 하고 실수를 하면 안 된다.
이렇게 푼다고 할지라도 나중에 유지보수가 너무 힘들것 같아서 처음부터 다시 풀기로 하였다.
function solution(cap, n, deliveries, pickups) {
const saveCap = cap
let pickupCap = cap
let length = 0
let flag = true
let index = deliveries.length - 1
while (index > 0){
// 차가 만차면 바로 회차
if(pickupCap === 0) {
flag = true
cap = saveCap
pickupCap = saveCap
continue
}
// 배송 & 수거
if(cap - deliveries[index] >= 0){
// 배송
cap -= deliveries[index]
if(deliveries[index]) deliveries[index] = 0
if(flag){
flag = false
length += (index + 1) * 2
}
// 수거 후 다음 집
if(pickupCap - pickups[index] >= 0){
pickupCap -= pickups[index]
pickups[index] = 0
index -= 1
continue
}else{ // 일부 수거 후 회차
pickups[index] -= pickupCap
pickupCap = saveCap
flag = true
}
// 일부 배송 및 회차
}else {
// 일부 배송
deliveries[index] -= cap
let nowIndex = index
// 수거 할 수 있고 수거 할거 있으면 수거하면서 회차
while(pickupCap > 0) {
if(pickupCap - pickups[nowIndex] >= 0){
pickupCap -= pickups[nowIndex]
pickups[nowIndex] = 0
nowIndex -= 1
}else{
pickups[nowIndex] -= pickupCap
break
}
}
cap = saveCap
pickupCap = saveCap
flag = true
}
}
return length
}
틀린 코드 2
if문으로 분기를 나누지말고 다 더해보자고 생각했다.
문제를 그대로 이해하고 코드를 작성하지 말고 코드로 작성하기 편하게 문제를 변형하지 않는 범위 내에서 수정하면 훨씬 쉬워진다.
function solution(cap, n, deliveries, pickups) {
let answer = 0
let deliveryCap =0
let pickUpCap =0
// 가장 먼 곳부터 체크
for(let i = n - 1; i >= 0; i--) {
deliveryCap += deliveries[i]
pickUpCap += pickups[i]
if(deliveryCap > 0 || pickUpCap > 0) {
deliveryCap -= cap
pickUpCap -= cap
answer += (i + 1) * 2
}
}
return answer
}
배열의 뒤에서 부터 체크를 하기에 if문은 회수를 시작하거나 배송을 시작한 지점을 찾기 위해서이다.
그 지점이 가장 먼거리이기 때문이다.
그리고 `cap`만큼 빼준다. 이렇게 하면 `deliveryCap` 또는 `pickUpCap`이 마이너스가 될 수도 있다 하지만 상관없다. 잉여분이라고 생각하면 편하다.
하지만 이렇게하면 테스트코드는 통과하지만 제출하면 틀린다.
why?
for문이기에 if문은 한 번만 거치고 다음 `index`로 넘어가버린다.
즉 위와 같은 테스트 케이스가 나오면 답이 달라진다. 왜냐하면 회수를 하러 2번은 왔다 갔다 해야 하는데 한 번만 왔다 가기 때문이다.
예를 들어서 택배를 배달하는데 출발지는 수원이다. 배송지는 파주와 서울이다. 파주는 100박스, 서울은 10박스를 배송해야 하고 가장 멀리 있는 지역부터 배달해야 한다. 위 코드를 사용하면 파주 10박스 서울 10박스가 배달이 된다. 그래서 오답이 나오는 거다. 파주를 10번 왔다 갔다 하고 서울로 배송을 해야 총 110박스를 배달할 수 있다. 그래서 if대신 while을 넣었다.
최종 코드
function solution(cap, n, deliveries, pickups) {
let answer = 0
let deliveryCap =0
let pickUpCap =0
// 가장 먼 곳부터 체크
for(let i = n - 1; i >= 0; i--) {
deliveryCap += deliveries[i]
pickUpCap += pickups[i]
//
while(deliveryCap > 0 || pickUpCap > 0) {
deliveryCap -= cap
pickUpCap -= cap
answer += (i + 1) * 2
}
}
return answer
}
와 문제푸는데 오래 걸렸다. level.3 정도는 되는 것 같다. 하지만 또 간단하게 생각하면 간단하게 풀려서 허무하다.
정말 나의 실력이 부족한게 느껴진다. 항상 최선을 다해서 자만하지 말고 꾸준히 공부하자
더 많은 문제를 풀어보고 더 생각을 많이 해봐야한다.
카카오 해설에서는 문제를 쉬운순으로 배치하였다고 하는데 이 문제는 두 번째에 위치한 문제이다.
세 번째 문제가 이모티콘 할인 행사인데 그건 이거보다 훨씬 쉬웠는데 뭔가 난이도가 이상하다.
'알고리즘 > 프로그래머스 - JS' 카테고리의 다른 글
[프로그래머스 - JS] level.1 햄버거 만들기 ❗️실수 (0) | 2023.06.19 |
---|---|
[프로그래머스 - JS] level.1 달리기 경주 ❗️ (0) | 2023.06.17 |
[프로그래머스-JS] level.2 이모티콘 할인 행사 ⭐️⭐️ (0) | 2023.06.13 |
[프로그래머스-JS] level.2 거리두기 확인하기 (0) | 2023.06.10 |
[프로그래머스] level.1 공원 산책 ⭐️ (0) | 2023.06.08 |