프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
나의 풀이
먼저 처음 풀었던 코드이다.
틀린 코드
테스트케이스는 통과하지만 허점이 있다.
일단 가독성이 최악이고 처음 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 |