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

Benjamin·2023년 2월 19일
0

프로그래머스

목록 보기
24/58



이 문제는 조금 어려워서 다른 사람의 풀이를 보고 풀었다.

필요 개념

  • 구현
    if문을 통해 세 선분을 비교해도 풀 수 있으나, 아이디어만 잘 세우면 그냥 배열에 카운팅만 해서 구현해주면 된다.

풀이

선분의 수치는 -100~100 이다. 수치를 +100씩 해준다면 0~200 범위가 된다.
따라서 배열에 해당 선분이 차지하는 범위만큼 카운팅을 해줄 수 있다.
예를들어 아래와 같이 카운팅을 해줄 경우, 배열의 수치가 2 또는 3인 부분이 '두 개 이상의 선분이 겹치는 부분'이다.

주의점은 그냥 [a, b] 범위에 대해 카운팅하는건 점에 대한 카운팅이다. 이 문제에서는 겹치는 면을 찾아야하므로, [a, b) 범위를 카운팅 해야 한다.

코드

import java.util.*;

class Solution {
    public int solution(int[][] lines) {
        int answer = 0;
        int[] count = new int[200];
        for(int[] line : lines) {
            int a = line[0]+100;
            int b = line[1]+100;
            while(a<b) {
                if(++count[a++] == 2) answer++;
            }
        }
        return answer;
    }
}

공부한 사항

  • 2차원 배열을 향상된 for문에서 1차원 배열로 넘기는 형식으로 바로 사용할 수 있다.
    for(int[] line : lines)
    그러면 lines[0][0], lines[0][1]의 요소가 차례대로 line[0], line[1]로 들어가고,
    그 다음 반복에서는 lines[1][0], lines[1][1]이 차례대로 line[0], line[1]을 덮어쓰고.. 이런식으로 진행된다.
    -> 향상된 for문의 조건식에 2차원배열, 1차원배열을 쓸 수 있다!!

  • if(++count[a++] == 2) 이 표현에 유의하자.
    여러줄로 코드를 짤 필요없이, 선 덧셈인지 후 덧셈인지 유의하면 이렇게 한 줄로 구성이 가능하다.

참고
https://nahwasa.com/entry/%EC%9E%90%EB%B0%94-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EA%B2%B9%EC%B9%98%EB%8A%94-%EC%84%A0%EB%B6%84%EC%9D%98-%EA%B8%B8%EC%9D%B4-Lv0-Java

0개의 댓글