알고리즘

프로그래머스 JS | 다리를 지나는 트럭

2022. 11. 12. 14:30
목차
  1. ❌ Solution ( 14.3 / 100 )
  2. ✅ Solution(100 / 100)

❌ Solution ( 14.3 / 100 )

function solution(bridge_length, weight, truck_weights) {
    const totalTrucks = truck_weights.length;
    let timer = 0;
    let load = 0;
    const onBridge = [];
    const complete = [];
    
    while(totalTrucks !== complete.length) {
        if( load + truck_weights[0] <= weight) {
            // 현재 load 값과 다음 트럭의 무게의 합이 weight 보다 작으면, onBridge 다음 트럭을 넣고 timer를 추가한다. 
            // load 에는 다리 위에 올라간 트럭의 무게를 더한다. 그리고 onBridge 배열에 트럭을 추가한다.
            // onBridge 트럭에 추가된 트럭은 truck_weights 배열에서 제거 
            onBridge.unshift(truck_weights[0]);
            load += truck_weights[0];
            truck_weights.shift();
            timer++;
        } else {
            // load 값이 더 크다면, onBridge에 빈 트럭을 넣고, timer를 추가한다. 
            onBridge.unshift(0);
            timer++;
        }
        
        // 만약 onBridge의 length 가 bridge_length 값보다 크다면 onBridge 배열의 마지막 값을 배열에서 제거한다. 
        // 이때 제거되는 값이 0이 아니면 load 값에서도 해당 값을 빼준다. 
        // 트럭이 완전히 다리를 넘어가면 complete 배열에 추가한다. complete 배열과 totalTrucks 값이 같다면 timer 를 return 한다.
        if( onBridge.length > bridge_length) {
            const del = onBridge[onBridge.length-1];
            if (del !== 0) load = load - del;
            complete.push(del);
            onBridge.pop();
        } 
        console.log(timer, load, complete, onBridge, truck_weights);
    } 
    
    return timer;
}

하지만 위 로직은 2개의 테스트 케이스는 통과했지만 테스트 케이스 1번은 통과하지 못했다.

콘솔에 확인을 해본 결과, 트럭이 다리를 건너며 load가 업데이트 되고, 업데이트된 load 값에 따라 새로운 트럭이 들어오는 과정이 한번에 처리되지 않고 분할 처리되어 발생하는 문제로 파악되었다. 

onBrigde 배열의 길이가 다리의 길이보다 길어졌을 때 onBridge 배열의 마지막 인자를 처리하고 업데이트 되는 load 값에 따라 다음 단계에서 처리될 코드들을 내부에 함께 넣어서 위 사진에서 3~4 번째 실행될 코드가 한번에 처리될 수 있도록 코드를 추가하였다. 

...
	if( onBridge.length > bridge_length) {
            const del = onBridge[onBridge.length-1];
            if (del !== 0) {
                load = load - del;
                complete.push(del);
            }
            if (load + truck_weights[0] <= weight) {
                onBridge.unshift(truck_weights[0]);
                onBridge.pop();
                load += truck_weights[0];
                truck_weights.shift();
            }
        }
...

하지만 이렇게 코드를 작성할 경우 시간초과로 역시 오답이 출력되었다. 

shift, unshift 메소드의 시간복잡도가 커서 발생하는 문제로 추측된다.

✅ Solution(100 / 100)

const bridge_length = 2;
const weight = 10;
const truck_weights = [7,4,5,6];

function solution(bridge_length, weight, truck_weights) {
  const trucks = [...truck_weights];
  
  const passed = []; // 지나간 트럭 배열.
  const bridge = []; // 다리
  let bridgeWeight = 0; // 지금 다리의 무게
  let count = 0; // 지나간 초, return 할 값.
  
  // 파라미터로 들어온 truck_weights의 길이와 지나간 트럭 배열의 길이가 다를 동안.
  while(passed.length !== truck_weights.length){
    count++;
    // 만약 다리 배열 bridge의 마지막이 숫자라면
    if(typeof bridge[bridge_length-1] === 'number'){
      const truck = bridge.pop(); // 마지막 트럭을 다리에서 빼낸다.
      bridgeWeight -= truck; // 트럭의 무게만큼 지금 무게에 뺀다.
      // 트럭이 0보다 크면 (실제 트럭) 지나간 트럭 배열에 넣는다.
      if(truck > 0) passed.push(truck); 
    }
    
    //지금 무게와 1번 트럭이 통과 가능하면
    if(trucks[0] + bridgeWeight <= weight){
      bridgeWeight += trucks[0]; // 트럭을 다리에 넣음.
      bridge.unshift(trucks.shift()); // 다리에서 앞으로 넣어준다.
    }else{
      // 트럭이 못지나가므로 빈트럭 0 을 넣어 준다.
      bridge.unshift(0);
    }
  }
  return count;
}

혼자서는 해결책을 찾지 못해 다른사람들의 여러 풀이를 찾아보았는데, 이 풀이가 가장 직관적이고 간단한 것 같다.

출처
- ScriptKid, velog, [코딩테스트/JS] 다리를 지나는 트럭

'알고리즘' 카테고리의 다른 글

백준 JS | 재귀의 귀재  (0) 2022.12.29
백준 JS | 좌표 압축  (0) 2022.12.26
프로그래머스 JS | 소수찾기(완전탐색)  (0) 2022.11.06
프로그래머스 JS | 올바른 괄호  (0) 2022.11.05
프로그래머스 JS | H-index  (0) 2022.11.05
  1. ❌ Solution ( 14.3 / 100 )
  2. ✅ Solution(100 / 100)
'알고리즘' 카테고리의 다른 글
  • 백준 JS | 재귀의 귀재
  • 백준 JS | 좌표 압축
  • 프로그래머스 JS | 소수찾기(완전탐색)
  • 프로그래머스 JS | 올바른 괄호
3jun
3jun
3jun3jun 님의 블로그입니다.
3jun
3jun
3jun
전체
오늘
어제
  • 분류 전체보기 (94)
    • 프로젝트 (5)
    • Web (9)
    • JavaScript (19)
    • React (12)
    • 알고리즘 (31)
    • Git (3)
    • AWS (3)
    • TypeScript (3)
    • CS (2)
    • Error (6)
    • 회고 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 프로그래머스 코테
  • airbnb style guide
  • 유효성 로직
  • 프로그래머스 코딩테스트
  • 백준 온라인저지
  • react
  • 프로그래머스 코딩테스트 js
  • 백준 코테
  • 자바스크립트
  • msw 에러
  • 프로그래머스 js
  • Promise
  • 백준js
  • this.props.history.push
  • 백준 알고리즘
  • JavaScript
  • msw
  • state
  • outer environment
  • 백준 js

최근 댓글

최근 글

hELLO · Designed By 정상우.
3jun
프로그래머스 JS | 다리를 지나는 트럭
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.