[프로그래머스]겹치는 선분의 길이
겹치는 선분의 길이
문제 설명
선분 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