몸과 마음이 건전한 SW 개발자

프로그래머스 [Lv. 2] [PCCP 기출문제] 3번 / 충돌위험 찾기 {언어 : JavaScript} 본문

알고리즘/풀었지만 다시 보기

프로그래머스 [Lv. 2] [PCCP 기출문제] 3번 / 충돌위험 찾기 {언어 : JavaScript}

스위태니 2024. 9. 30. 13:35

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/340211

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

정답 코드

function solution(points, routes) {
    let visited = new Map();;
    const isCrushed = (sr, sc, cnt) => {
        const locKey = `${sr},${sc},${cnt}`;
        if (visited.has(locKey)) {
            visited.set(locKey, visited.get(locKey)+1);
        } else {
            visited.set(locKey, 1);
        }
        return;
    };

    const moveFC = (sr, sc, er, ec, tmp, same) => {
        // 이동 시 카운터 증가를 통해 이동 경로 관리
        let cnt = tmp;
        if (!same) {
            isCrushed(sr, sc, cnt);
        }
        // 행 이동 처리
        if (sr < er) {
            while (sr < er) {
                cnt++;
                sr++;
                isCrushed(sr, sc, cnt);
            }
        } else {
            while (sr > er) {
                cnt++;
                sr--;
                isCrushed(sr, sc, cnt);
            }
        }

        // 열 이동 처리
        if (sc < ec) {
            while (sc < ec) {
                cnt++;
                sc++;
                isCrushed(sr, sc, cnt);
            }
        } else {
            while (sc > ec) {
                cnt++;
                sc--;
                isCrushed(sr, sc, cnt);
            }
        }

        return cnt;
    };

    // 경로마다 출발점과 도착점으로 이동
    const lenR = routes[0].length;
    for (const route of routes) {
        let same = false;
        let count = 0;
        for (let i = 1; i < lenR; i++) {
            const start = route[i-1];
            const end = route[i];
            const [sr, sc] = points[start-1];
            const [er, ec] = points[end-1];
            count = moveFC(sr, sc, er, ec, count, same);
            same = true;
        }
    }
    let answer = 0;
    for (const [key, value] of visited) {
        if (value > 1) {
            answer++;
        }
    }
    return answer;
}

풀이 방법

  • 같은 시간에 같은 지점을 key로 만들어서 객체에 저장하는 형태로 진행했다.
  • 1, 1 지점에 1초에 지나가게 될 경우 "1,1,1"이 키가 된다.
  • 이미 지나갔다면 해당 위치의 value값에 1을 더해주고 아니면 1로 초기화시킨다.
  • 마지막에 values 중에 2이상인 값을 찾고 answer++를 해주면 끝!

느낀점

  • 이 과정에서 그냥 객체 {}와 map()을 사용해서 비교해봤다.
  • {}는 가장 오래걸리는 테스트케이스가 2000ms 이상이 나왔다.
  • 하지만 map()은 700ms이 나오면서 더 효율적이라는 것을 알 수 있었다.