본문 바로가기
Algorithm/Programmers

[Programmers] Lv.0 | 겹치는 선분의 길이 | Java

by unknownomad 2025. 3. 11.

문제

https://school.programmers.co.kr/learn/courses/30/lessons/120876

 

포인트

  • 연속된 숫자로 구간을 표현할 때, 끝점은 포함하지 않아도 됨

 

풀이

class Solution {
    public int solution(int[][] lines) {
        int[] arr = new int[200];
        int answer = 0;
        
        for (int i = 0; i < lines.length; i++) {
            for (int j = lines[i][0] + 100; j < lines[i][1] + 100; j++) {
                arr[j]++;
            }
        }
        
        for (int i = 0; i < 200; i++) {
            if (arr[i] > 1) {
                answer++;
            }
        }
        return answer;
    }
}
import java.util.*;

class Solution {
    public int solution(int[][] lines) {
        Map<Integer, Integer> map = new HashMap<>();
        
        for (int[] line : lines) {
            int from = Math.min(line[0], line[1]); //그냥 line[0] 해도 됨
            int to = Math.max(line[0], line[1]); //그냥 line[1] 해도 됨
            
            for (int i = from; i < to; i++) {
                map.merge(i, 1, Integer::sum);
            }
        }

        return (int) map.values().stream().filter(i -> i > 1).count();
    }
}

BiFunction<oldValue, newValue, result>

map.merge(key, value, BiFunction<oldValue, newValue, result>)
  • 기존에 값이 있으면 (oldValue + newValue)를 수행 (즉, Integer::sum → 기존 값에 1을 더함)
  • 기존에 값이 없으면 newValue(즉, 1)을 저장
class Solution {
    public int solution(int[][] lines) {
        int answer = 0;

        for (int i = -100; i < 100; i++) {
            int count = 0;

            // 모든 선분을 확인하여 겹치는 개수 카운트
            for (int[] line : lines) {
                if (line[0] <= i && line[1] > i) {
                    count++;
                }
            }

            // 두 개 이상 겹치는 경우 answer 증가
            if (count > 1) answer++;
        }

        return answer;
    }
}

댓글