Coding Test/JAVA 코딩테스트 풀이정리(프로그래머스)

프로그래머스 스쿨 Lv.0 - 겹치는 선분의 길이(점을 이용한 선분의 길이 구하기 및 예외처리)
깝몬 2023. 12. 22. 15:04

문제

 

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

 

프로그래머스

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

programmers.co.kr

 

정답

class Solution {
    public int solution(int[][] lines) {
        
        int[] passPoint = new int[202];
        int answer=0;
        for(int i=0;i<lines.length;i++){
            int start = lines[i][0]+100; 
            int end = lines[i][1]+100;
            for(int j=start;j<=end;j++){
                passPoint[j]++;
            }
        }
        
        for(int i=0;i<=201;i++){
            if(passPoint[i]>1 && passPoint[i+1]>1) {
            answer++;
            if(i-100 == lines[0][1] && i-99 == lines[1][0])answer--;
            if(i-100 == lines[0][1] && i-99 == lines[2][0])answer--;
            if(i-100 == lines[1][1] && i-99 == lines[2][0])answer--;
            }           
        }
        return answer;
    }
}

 

선분들이 지난 점들 모두 +100하여 담은 배열을 이용해 앞의 점과 그 뒤의 점이 지난 횟수가 1초과라면 선분의 길이를 1 늘려주었다.

 

그리고 예외처리를 하였다. 그에 대한 설명은 아래에

 

 

 

오답과 고찰

마지막 for문에서 예외처리를 하지 않을 경우 문제가 발생했다.

 

테스트케이스에서 실패가 뜬것을 보면 로직상 문제가 있는 것이다.

 

 

 

이 상황을 살펴보면 예외의 이유를 알 수 있다.

 

-1도 지나는 선이 2개, 0도 지나는선이 2개이다. 위의 조건에 맞으나, 그 사이는 한개의 직선만 지나게 된다.

 

이러한 빈틈이 발생 하는 상황은 앞의 점이 누군가의 마지막, 뒤의 점이 누군가의 끝 일때 발생하게 되어 for문에 그러한 상황을 막는 예외처리를 했더니 정답이 되었다.