thumbnail

[lv.0] 겹치는 선분의 길이 | 프로그래머스

[lv.0] 겹치는 선분의 길이 | 프로그래머스

📋 [ 프로그래머스 ] 시리즈 몰아보기 (17)

✏️ (lv.0) : 겹치는 선분의 길이

선분 3개가 평행하게 있다. 세 선분의 시작과 끝 좌표가 주어질 때, 2개 이상의 선분이 겹치는 부분의 길이를 return하는 solution을 작성하라.


  • lines의 길이 = 3, lines의 원소 길이 = 2
  • 모든 선분은 길이가 1 이상이다.
  • 각 단어는 최대 한 번씩만 등장한다.
  • lines의 원소는 [a, b] 형태이며, a, b는 각각 선분의 양 끝점 이다.
    • -100 <= a < b <= 100
  • 겹치는 선분이 없으면 0을 return한다.

각 선분이 포함한 숫자가 겹칠 경우 해당 부분이 겹친다고 판단할 수 있다..

  • 각 좌표의 a부터 b까지의 숫자를 쪼개서 저장한 후 다음 좌표의 a부터 b까지의 숫자와 얼마나 일치하는지를 비교한다.
    • Math.min(), Math.max()를 활용해 어느 선분이 포함되는지 여부를 고려하지 않을 수 있다. 즉 선분 A와 B중 어느 선분이 포함되는 선분인지 고려하지 않는다는 뜻이다.
    • min + 1부터 max까지의 값이 곧 선분이 지나간 숫자를 뜻한다. 선분은 항상 1보다 크기 때문에 min 자기 자신은 제외한다.
    • 각 선분이 지나가는 숫자를 overlap의 원소 item에 초기화해준다. 기본값은 1로 { 지나가는 숫자:1 }의 형태이다.
    • reduce()의 인자를 활용해 현재 item과 이전의 item을 비교할 수 있다. 이때 겹치는 숫자가 발생하면 해당 자리의 값에 1을 더해준다. 만약 3이 겹친다면 3을 2번지나간게 되므로 { 3: 2 }의 형태가 된다.
    • 이를 반복하여 최종적으로 지나간 횟수가 1 이상인 경우의 횟수를 return해준다.
          
1 function solution(lines) {
2 const overlap = lines.reduce((item, [x, y]) => {
3 for (let i = Math.min(x, y) + 1; i <= Math.max(x, y); i++) {
4 item[i] = item[i]
5 ? item[i] + 1
6 : 1;
7 }
8
9 return item;
10 }, {});
11
12 return Object.values(overlap).filter(v => v > 1).length;
13 }
# 프로그래머스
# JS
# javascript
# 코딩테스트
# 알고리즘

💡 로그인 하지 않아도 댓글을 등록할 수 있습니다!

👨‍💻 관련 포스트