프로그래머스 겹치는 선분의 길이

KIMYEONGJUN·2026년 9월 23일
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

선분 3개가 평행하게 놓여 있습니다.
세 선분의 시작과 끝 좌표가 [[start, end], [start, end], [start, end]] 형태로 들어있는 2차원 배열 lines가 매개변수로 주어질 때, 두 개 이상의 선분이 겹치는 부분의 길이를 return 하도록 solution 함수를 완성해보세요.
lines가 [[0, 2], [-3, -1], [-2, 1]]일 때 그림으로 나타내면 다음과 같습니다.
선분이 두 개 이상 겹친 곳은 [-2, -1], [0, 1]로 길이 2만큼 겹쳐있습니다.

내가 이 문제를 보고 생각해본 부분

Main152 클래스: 인텔리제이에서 바로 실행해 볼 수 있도록 만든 테스트용 클래스이다.
테스트 케이스 설정: lines1, lines2, lines3 배열을 선언하고 Solution 객체의 solution 메서드를 호출해 결과를 화면에 출력한다.
음수 좌표 처리: 문제에서 좌표 범위가 -100부터 100까지이다.
자바 배열 인덱스는 음수가 될 수 없으므로, 전체 좌표에 100을 더해 0부터 199까지의 인덱스로 바꿔서 사용할 수 있도록 배열을 생성한다.
선분 순회: 주어진 3개의 선분을 하나씩 꺼내어 시작점(start)과 끝점(end)을 구한다.
이때도 각각 +100을 더해 보정한다.
구간 체크: 시작점부터 끝점 직전까지 반복문을 돌며 지나치는 칸마다 count[i]++를 수행한다.
해당 단위 구간을 몇 개의 선분이 지나갔는지 기록하는 과정이다.
결과 도출: 완성된 count 배열을 처음부터 끝까지 확인한다.
조건 검사: 값이 2 이상인 칸은 두 개 또는 세 개의 선분이 겹쳐 있다는 뜻이므로, 그 개수만큼 answer를 1씩 증가시킨다.
리턴: 최종적으로 계산된 겹친 선분의 총 길이를 반환한다.

코드로 구현

class Solution {
    public int solution(int[][] lines) {
        int answer = 0;
        
        int[] count = new int[200];

        for (int[] line : lines) {
            int start = line[0] + 100;
            int end = line[1] + 100;
            
            for (int i = start; i < end; i++) {
                count[i]++;
            }
        }

        for (int c : count) {
            if (c >= 2) {
                answer++;
            }
        }

        return answer;
    }
}

프로그래머스 코드

package programmers.programmers2;

// 프로그래머스 겹치는 선분의 길이
public class Main152 {
    public static void main(String[] args) {
        Solution sol = new Solution();

        int[][] lines1 = {{0, 1}, {2, 5}, {3, 9}};
        int[][] lines2 = {{-1, 1}, {1, 3}, {3, 9}};
        int[][] lines3 = {{0, 5}, {3, 9}, {1, 10}};

        System.out.println(sol.solution(lines1)); // 결과: 2
        System.out.println(sol.solution(lines2)); // 결과: 0
        System.out.println(sol.solution(lines3)); // 결과: 8
    }

    static class Solution {
        public int solution(int[][] lines) {
            int answer = 0;

            int[] count = new int[200];

            for (int[] line : lines) {
                int start = line[0] + 100;
                int end = line[1] + 100;

                for (int i = start; i < end; i++) {
                    count[i]++;
                }
            }

            for (int c : count) {
                if (c >= 2) {
                    answer++;
                }
            }

            return answer;
        }
    }
}

위에 있는 코드를 변경한 코드

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글