본문 바로가기
Algorithm/Programmers

[프로그래머스 JS] 겹치는 선분의 길이

by 그랴 2022. 12. 13.

문제

더보기

문제 설명

선분 3개가 평행하게 놓여 있습니다. 세 선분의 시작과 끝 좌표가 [[start, end], [start, end], [start, end]] 형태로 들어있는 2차원 배열 lines가 매개변수로 주어질 때, 두 개 이상의 선분이 겹치는 부분의 길이를 return 하도록 solution 함수를 완성해보세요.

lines가 [[0, 2], [-3, -1], [-2, 1]]일 때 그림으로 나타내면 다음과 같습니다.

선분이 두 개 이상 겹친 곳은 [-2, -1], [0, 1]로 길이 2만큼 겹쳐있습니다.


제한사항
  • lines의 길이 = 3
  • lines의 원소의 길이 = 2
  • 모든 선분은 길이가 1 이상입니다.
  • lines의 원소는 [a, b] 형태이며, a, b는 각각 선분의 양 끝점 입니다.
    • -100 ≤ a < b ≤ 100

입출력 예linesresult
[[0, 1], [2, 5], [3, 9]] 2
[[-1, 1], [1, 3], [3, 9]] 0
[[0, 5], [3, 9], [1, 10]] 8

입출력 예 설명

입출력 예 #1

  • 두 번째, 세 번째 선분 [2, 5], [3, 9]가 [3, 5] 구간에 겹쳐있으므로 2를 return 합니다.

입출력 예 #2

  • 겹친 선분이 없으므로 0을 return 합니다.

입출력 예 #3

  • 첫 번째와 두 번째 선분이 [3, 5] 구간에서 겹칩니다.
  • 첫 번째와 세 번째 선분 [1, 5] 구간에서 겹칩니다.
  • 두 번째와 세 번째 선분 [3, 9] 구간에서 겹칩니다.
  • 따라서 [1, 9] 구간에 두 개 이상의 선분이 겹쳐있으므로, 8을 return 합니다.

 

처음에 내가 생각했던 로직은 다음과 같다.

1. 시작점이 가장 왼쪽에 있는 순서대로 정렬

2. 겹치는 부분이 있는 지 체크 (ex. 1번 선분의 끝점 > 2번 선분의 시작점 -> 겹침!)

3. 겹치는 길이 = 두 선분의 총 길이 - 첫번째점 사이 간격 - 두번째점 사이 간격

 

틀린 방법은 아닌데, 이 방법은 선분 2개까지만 먹힌다는 것이다. 테스트 케이스를 돌려보니, 선분 3개가 겹치는 경우도 있어서 이에 대한 처리가 추가적으로 필요했다.

 

위에 작성한 방법은 그대로 하되, 겹치는 부분을 배열로 따로 담아서 중복된 부분이 있는지를 확인해주기로 했다.

 


아무리 해도 안 풀려서.. 해답 찾아봤는데 레전드 현타 온다.

자바스크립트 메소드 공부랑 알고리즘 ㅁ공부 열심히 해야겟다 ^_^

https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/%EA%B2%B9%EC%B9%98%EB%8A%94-%EC%84%A0%EB%B6%84%EC%9D%98-%EA%B8%B8%EC%9D%B4&120876&.js

 

GitHub - codeisneverodd/programmers-coding-test: 프로그래머스 코딩테스트 해설 모음집

프로그래머스 코딩테스트 해설 모음집. Contribute to codeisneverodd/programmers-coding-test development by creating an account on GitHub.

github.com


해설 코드 공부

function solution(lines) {
    const visited = lines.reduce((a, [x, y]) => {
    for (let i = Math.min(x, y) + 1; i <= Math.max(x, y); i++) a[i] = a[i] ? a[i] + 1 : 1;
    return a;
  }, {});

  return Object.values(visited).filter(v => v > 1).length;
}

 

1. reduce()

배열의 각 요소에 대해 주어진 리듀서 (reducer) 함수를 실행하고 하나의 결과값을 반환한다.

 

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

 

Array.prototype.reduce() - JavaScript | MDN

reduce() 메서드는 배열의 각 요소에 대해 주어진 리듀서 (reducer) 함수를 실행하고, 하나의 결과값을 반환합니다.

developer.mozilla.org