문제
문제 설명
선분 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개가 겹치는 경우도 있어서 이에 대한 처리가 추가적으로 필요했다.
위에 작성한 방법은 그대로 하되, 겹치는 부분을 배열로 따로 담아서 중복된 부분이 있는지를 확인해주기로 했다.
아무리 해도 안 풀려서.. 해답 찾아봤는데 레전드 현타 온다.
자바스크립트 메소드 공부랑 알고리즘 ㅁ공부 열심히 해야겟다 ^_^
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
'Algorithm > Programmers' 카테고리의 다른 글
[프로그래머스 JS] 체육복 (0) | 2022.12.14 |
---|---|
[프로그래머스 JS] 문자열 내림차순으로 배치하기 (아스키코드 변환) (0) | 2022.12.13 |
[프로그래머스 JS] 유한소수 판별하기 (0) | 2022.12.13 |
[프로그래머스 JS] 옹알이 (1) (1) | 2022.12.13 |
[프로그래머스 JS] 연속된 수의 합 (0) | 2022.12.13 |