연습장

61. 겹치는 선분의 길이 본문

프로그래머스/0단계

61. 겹치는 선분의 길이

js0616 2023. 8. 20. 17:04

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

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


문제의 이해를 돕기위해 나머지 예시 케이스도 그려보겠다. 

 

2번째의 경우

점에서 겹치는건 영향을 주지않고 선분이 겹치는게 없으므로 0이 된다.

 

 

3번째의 경우

 

1-9까지 => 8칸

 

3선분이 겹치는 3-5 구간은 추가로 영향을 주지 않는것을 알 수 있다. 

 

 


1. 겹치는 구간은 1단위로 계산을 한다. 

2. 1단위안에 있는 숫자를 기준으로 생각해보자

 

0-1 사이에는 0.5라는 수가 반드시 들어간다.

1-2 사이에는 1.5라는 수가 반드시 들어간다.

 

이런식으로 선분을 구체화 할 수 있다.

 

[0,5] 의 경우 -> [0.5, 1.5, 2.5, 3.5, 4.5]  이며

[3,9] 의 경우 -> [3.5, 4.5, 5.5, 6.5, 7.5, 8.5] 

[1,10] 의 경우 -> [1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5] 이고

 

전체 원소는 다음과 같다. 

-> [

0.5,

1.5, 1.5,

2.5, 2.5,

3.5, 3.5, 3.5,

4.5, 4.5, 4.5,  

5.5, 5.5,  

6.5, 6.5,  

7.5, 7.5, 

8.5 , 8.5,

9.5

 

같은 원소가 2개 이상인

 

[1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5]  

 

경우가 겹치는 부분이 되며 원소의 갯수인 8 이 겹치는 길이와 같으며 , 우리가 원하는 결과 값이다. 

 

 


 

// 선분을 숫자들로 만드는 함수
const linenum = function(line){
    let arr = []
    for(let i = line[0]; i<line[1] ; i++){
        arr.push(i+0.5)
    }
    return arr
}

이를 응용하여

 

 

중복되는 갯수를 새어줄 객체인 dic 를 하나 만들고

 

 

총 3개의 선분이므로 j 의 값은 0 1 2 만 들어가도록 한다.

그 다음 for 문은 선분을 숫자로 만드는 함수이며 

 

 i 값에 0.5 더한 값을

if 문을 이용하여 dic 에 저장한다. 

이후 다시 i 값을 원래대로 돌려놓는다. 

 

dic 의 value 중 2 이상인 것들의 갯수를 새면 

 

그게 우리가 원하는 선분이 겹치는 부분이 된다. 

 

function solution(lines) {
    var answer = 0;
    let dic = {}

    for(let j = 0 ; j <3 ; j++){
        for(let i = lines[j][0]; i<lines[j][1] ; i++){
            i = i+0.5
            if(i in dic){
                dic[i]++
            }
            else{
                dic[i] = 1
            }
            i = i-0.5
        }
   
    }
    // console.log(dic)
    for(i in dic){
        if(dic[i]>=2){
            answer++
        }
    }
    return answer
}

 

console.log(dic) 결과

1.5 2.5 3.5 4.5 5.5 6.5 7.5 8.5 가 각각 2 이상이다. (1부터 9까지 겹친다는 뜻)   

--> 위에서 설명한 결과대로 나온것을 알 수 있다. 

 

 

'프로그래머스 > 0단계' 카테고리의 다른 글

63. 정수를 나선형으로 배치하기  (0) 2023.08.21
62. 안전지대  (0) 2023.08.20
60. 평행  (0) 2023.08.20
59. 이차원 배열 대각선 순회하기  (0) 2023.08.20
58. 최빈값 구하기  (0) 2023.08.19