본문 바로가기

Algorithm/Programers - Java

[프로그래머스(Java)] 겹치는 선분의 길이 / map.merge()

 

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

 

Map 그리고 merge()

Java의 자료구조 중 Map에 대해 이야기 해보려합니다. HashMap, TreeMap 두가지에 모두 적용되는 이야기입니다. 간단히 두 맵에 대해 알아보고, 알아두면 좋을 내용들 그리고 마지막으로 merge에 대해 살

exponential-e.tistory.com

 

 


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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr