본문 바로가기

Java/프로그래머스

[JAVA] 프로그래머스 - 겹치는 선분의 길이

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

 

프로그래머스

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

programmers.co.kr

 

 

 

 

 

 

시도 1)

 

import java.util.ArrayList;
import java.util.Collections;

class Solution {
    public int solution(int[][] lines) {
        int answer = 0;
        ArrayList<Integer> overlap = new ArrayList<>();
        
        for(int i=0; i<lines.length; i++)
        {
            for(int j=i+1; j<lines.length; j++)
            {
                if(lines[i][1]>lines[j][0])
                {
                    overlap.add(lines[i][1]-lines[j][0]);
                }
            }
        }
        
        if(overlap.size()==0)
        {
            answer = 0;
        }
        else
        {
            answer = Collections.max(overlap);
        }
        
        
        
        return answer;
    }
}

 

ㅋㅋㅋ

 

 

 

겹치는 선분의 길이(Lv0) - 자바 Java 프로그래머스 문제 풀이 (youtube.com)

 

 

- 몇 개의 선분이 겹쳐 있는지 개수 표현 

 

- 입력값이 -100~100인데 음수 표현 못하니까  100을 더해서 양수로 표현 ( 0~200)

 

 

- 배열을 쭉 훑으면서 값이 1 초과하는 것들의 개수를 세어주면 됨 

 

1) arr 배열 및 변수 초기화 

2) lines 정보를 arr 배열에 적용 

3) arr 배열에서 겹친 부분 세기 

 

 

정답 

 

 

class Solution {
    public int solution(int[][] lines) {
        int answer = 0;
        
        //1. arr 배열 및 변수 초기화 
        int arr[] = new int[200];
        
        //2. lines 정보를 arr배열에 적용 
        for(int i=0; i<lines.length; i++)
        {
            for(int j=lines[i][0]+100; j<lines[i][1]+100; j++)
            {
                arr[j]++;
            }
        }
        
        //3. arr 배열에서 겹친 부분 세기
        for(int i=0; i<200; i++)
        {
            if(arr[i]>1)
                answer++;
        }
        return answer;
    }
}

 

 

 

다른 사람의 풀이 

 

import java.util.HashMap;
import java.util.Map;
class Solution {
    public int solution(int[][] lines) {
        Map<Integer, Integer> map = new HashMap<>();

        for (int i=0; i<lines.length; i++) {
            int min = Math.min(lines[i][0], lines[i][1]);
            int max = Math.max(lines[i][0], lines[i][1]);

            for (int j=min; j<max; j++) {
                map.put(j, map.getOrDefault(j, 0) + 1);
            }
        }

        int answer = 0;

        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            if (entry.getValue() >= 2) {
                answer++;
            }
        }

        return answer;
    }
}