선분 3개가 평행하게 놓여 있습니다. 세 선분의 시작과 끝 좌표가 [[start, end], [start, end], [start, end]] 형태로 들어있는 2차원 배열 lines가 매개변수로 주어질 때, 두 개 이상의 선분이 겹치는 부분의 길이를 return 하도록 solution 함수를 완성해보세요.
lines가 [[0, 2], [-3, -1], [-2, 1]]일 때 그림으로 나타내면 다음과 같습니다.
선분이 두 개 이상 겹친 곳은 [-2, -1], [0, 1]로 길이 2만큼 겹쳐있습니다.
제한사항
function solution(lines) {
const answer = 0;
for (let i=-100; i<100; i++) {
let count = 0;
if (lines[0][0] <= i && lines[0][1] > i) count++;
if (lines[1][0] <= i && lines[1][1] > i) count++;
if (lines[2][0] <= i && lines[2][1] > i) count++;
if(count > 1) answer++;
}
return answer;
}
와 이건... 진짜 너무 어려웠다... 좌표랑 선분 이런거 나오면 진짜 죽겠음 제발 ㅠㅠ 사실 못 풀어서 남친이랑 같이 풀고 날 이해시켜달라고 당당하게 나왔음 하지만 아직도 혼자 풀라고 하면 못 풀 것 같음 젠장
if (lines[0][0] <= i && lines[0][1] > i) count++;
: 첫 번째 선분의 시작점이 i이하이고 끝점이 i를 초과하는 경우 count를 1 증가시킨다. if (lines[1][0] <= i && lines[1][1] > i) count++;
: 두 번째 선분의 시작점이 i이하이고 끝 점이 i를 초과하는 경우 count를 1 증가시킨다. if (lines[2][0] <= i && lines[2][1] > i) count++;
: 세 번째 선분의 시작점이 i이하이고 끝점이 i를 초과하는 경우 count를 1 증가시킨다. if(count > 1) answer++;
: 특정 정수 i에 대해서 1보다 크다는 의미는 겹치는 선분이라는 뜻이다. 겹치는 선분의 개수가 2개 이상인 경우에 answer를 1증가시킨다. 이를 통해서 겹치는 값 i를 구할 수 있다. 솔직히 이것이 그렇게 효율적인 코드인지는 잘 모르겠다. 왜냐면... i가 커지면 커질 수록 순환을 미친듯이 돌아야 하기 때문이다. 하지만 어떻게 푸는지 조차 이해가 안갔던 나 ^^,,, 겨우 좀 이해가 갈 것 같긴 한데 설명하는 건 언제나 어렵다.
function solution(lines) {
let line = new Array(200).fill(0);
lines.forEach(([a, b]) => {
for(; a < b; a++) line[a+100]++;
});
return line.reduce((a, c) => c > 1 ? a + 1 : a, 0)
}
for(; a < b; a++) line[a+100]++;
line[a+100]++
연산이 수행된다. a+100은 배열의 인덱스를 계산하는 부분이다.line[a+100]++
에서 ++
는 해당 인덱스의 값을 1 증가시키는 연산이다. 이를 통해서 각 좌표에서 겹치는 선분의 개수를 기록할 수 있다.a+1
을 해주고, 아니라면 a를 그대로 둔다.최종적으로 겹치는 선분의 길이를 모두 합한 a
값을 반환한다. 와... 이렇게 또 풀어봐야 하는데... 머리로 구조화하는 것이 진짜 어렵다. 어려워서 뤼튼한테 물어봄. 나중에 또 보면 이해 못할 것 같으니까 사진 첨부해둠.
이해가 안 가서 한 세 번은 다시 물어봤다 ㅋㅋㅋㅋ
function solution(lines) {
var min = Math.min(...lines.flat());
var max = Math.max(...lines.flat());
var totalOverlappedLength = 0;
function isInbound(x, [a,b]){
var s = Math.min(a,b);
var e = Math.max(a,b);
x = x + 0.5;
if ((s < x)&&(x < e)){
return true;
}
return false;
}
for(let x = min; x < max; x++){
var overlappedOnX = 0;
lines.forEach((el) => {
if(isInbound(x,el)){
overlappedOnX = overlappedOnX + 1;
}
});
if(overlappedOnX > 1){
totalOverlappedLength = totalOverlappedLength + 1;
}
}
return totalOverlappedLength;
}
totalOverlappedLength
는 겹치는 선분의 총 길이를 저장할 변수이다. isInbound(x, [a, b])
함수는 주어진 좌표 x가 선분 [a, b]안에 포함되는지를 확인한다. x에 0.5를 더하는 것은 정수 좌표에서 겹치는 부분을 확인하기 위한 것이다. overlappedOnX > 1
: 선분이 겹치는 경우 totalOverlappedLength를 1 증가시킨다.