
내가 생각했을때 문제에서 원하는부분
선분 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;
}
}
}
위에 있는 코드를 변경한 코드
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.