Level.0
문제
선분 3개가 평행하게 놓여 있습니다.
세 선분의 시작과 끝 좌표가 [[start, end], [start, end], [start, end]] 형태로 들어있는 2차원 배열 lines가 매개변수로 주어질 때,
두 개 이상의 선분이 겹치는 부분의 길이를 return 하도록 solution 함수를 완성해 보세요.
lines가 [[0, 2], [-3, -1], [-2, 1]]일 때 그림으로 나타내면 다음과 같습니다.
선분이 두 개 이상 겹친 곳은 [-2, -1], [0, 1]로 길이 2만큼 겹쳐있습니다.
* 제한사항
- lines의 길이 = 3
- lines의 원소의 길이 = 2
- 모든 선분은 길이가 1 이상입니다.
- lines의 원소는 [a, b] 형태이며, a, b는 각각 선분의 양 끝점입니다.
- -100 ≤ a < b ≤ 100
풀이
class Solution {
public int solution(int[][] lines) {
int[] arr = new int[201];
int answer = 0;
for(int i=0; i<lines.length; i++){
for(int j=lines[i][0]; j<lines[i][1]; j++){
arr[(j+2+j)/2+100] += 1; // 두 간선의 중간값
}
}
for(int i=0; i<201; i++){
if(arr[i] > 1) answer += 1;
}
return answer;
}
}
해결방법
1. -100 ≤ a < b ≤ 100 이므로, 201 크기의 배열 arr을 만들고 두 간선 사이의 중간값을 Index로 하여 value에 1을 더해주었다.
2. arr을 탐색하면서 value가 1 이상이라면, 선분이 두 개이상 겹쳤다는 의미이므로 answer에 1을 더해주었다.
다른 풀이
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]);
int to = Math.max(line[0], 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();
}
}
map.merge()
map2.forEach((key, value) -> map1.merge(key, value, (v1, v2) -> v2));
- key가 같을 때 value를 덮어쓴다.
- map을 서로 합병할 때 사용할 수 있으며, 위 코드는 map1과 map2의 key가 같을 경우 map2로 덮어쓰게 된다.
map.merge(key, value, Integer::sum);
map.merge(i, 1, Integer::sum);
- map에 없던 key가 들어올 경우, value를 기본 값으로 설정한다.
- Integer의 sum메서드를 사용하여 기존값에 value를 더하는 방식으로 사용할 수 있다.
https://exponential-e.tistory.com/76
https://school.programmers.co.kr/learn/courses/30/lessons/120876#
'Algorithm > Programers - Java' 카테고리의 다른 글
[프로그래머스(Java)] 정수를 나선형으로 배치하기 (0) | 2023.10.25 |
---|---|
[프로그래머스(Java)] 평행 (0) | 2023.10.25 |
[프로그래머스(Java)] 안전지대 (1) | 2023.10.19 |
[프로그래머스(Java)] 주사위 게임 3 / Collections.sort() (1) | 2023.10.15 |
[프로그래머스(Java)] 연속된 수의 합 (0) | 2023.10.14 |