이 문제는 조금 어려워서 다른 사람의 풀이를 보고 풀었다.
선분의 수치는 -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)
이 표현에 유의하자.
여러줄로 코드를 짤 필요없이, 선 덧셈인지 후 덧셈인지 유의하면 이렇게 한 줄로 구성이 가능하다.