1 minute read

겹치는 선분의 길이

문제 설명

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


제한사항

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

입출력 예

lines result
[[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 합니다.

나의 풀이 코드

import java.util.*;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
class Solution {
    public int solution(int[][] lines) {
        List<Integer> list_1 = new ArrayList<>() {
            {
                for (int i=lines[0][0]; i<lines[0][1]; i++){
                    add(i);
                }
            }
        };
        List<Integer> list_2 = new ArrayList<>() {
            {
                for (int i=lines[1][0]; i<lines[1][1]; i++){
                    add(i);
                }
            }
        };
        List<Integer> list_3 = new ArrayList<>() {
            {
                for (int i=lines[2][0]; i<lines[2][1]; i++){
                    add(i);
                }
            }
        };
        List<Integer> merged_list = new ArrayList<>();
        merged_list.addAll(list_1);
        merged_list.addAll(list_2);
        merged_list.addAll(list_3);
        int cnt = 0;
        Set<Integer> set = new HashSet<>(merged_list);
        for (Integer element : set) {
            if (Collections.frequency(merged_list, element)>1){
                System.out.println(element + " : " + Collections.frequency(merged_list, element));
                cnt++;
            }
        }
        return cnt;
    }
}

리스트를 3개를 만들고,
3개의 리스트를 모두 병합,
2개이상 중복이 있으면 cnt++한다.

배운점

class Solution {
    public int solution(int[][] lines) {
        int answer = 0;
        for (int i = -100; i < 100; i++) {
            int line = 0;
            if (lines[0][0]<=i && lines[0][1]>i) line++;
            if (lines[1][0]<=i && lines[1][1]>i) line++;
            if (lines[2][0]<=i && lines[2][1]>i) line++;

            if(line > 1) answer++;
        }

        return answer;
    }
}

다른사람이 푼 코드이다.
반복문안에서 조건문만 가지고도 쉽게 구현가능하다.

Leave a comment