프로그래머스 0단계 - 평행

이종현·2024년 1월 24일
0

코딩테스트

목록 보기
22/24
post-thumbnail

문제 설명

점 네 개의 좌표를 담은 이차원 배열  dots가 다음과 같이 매개변수로 주어집니다.

  • [[x1, y1], [x2, y2], [x3, y3], [x4, y4]]

주어진 네 개의 점을 두 개씩 이었을 때, 두 직선이 평행이 되는 경우가 있으면 1을 없으면 0을 return 하도록 solution 함수를 완성해보세요.


제한사항

  • dots의 길이 = 4
  • dots의 원소는 [x, y] 형태이며 x, y는 정수입니다.
  • 서로 다른 두개 이상의 점이 겹치는 경우는 없습니다.
  • 두 직선이 겹치는 경우(일치하는 경우)에도 1을 return 해주세요.
  • 임의의 두 점을 이은 직선이 x축 또는 y축과 평행한 경우는 주어지지 않습니다.

1. 문제 이해

  • input은 dots의 길이가 4이고, 원소 자체의 크기도 100을 넘지 않으니, 시간복잡도는 문제없음
  • x,y 축과 평행한 경우가 없다고 했으니, dots의 원소 중 x,y 값이 똑같은 경우는 두 선분이 겹치는 경우 밖에 없다.

2. 접근 방법

  • 직관적으로 생각하기
    - 선이 만들어질 수 있는 경우의 수는 모두 3가지다.
    - 3가지 경우의 수에서 x 값의 차이가 똑같은지 파악하거나 y 값 의 차이가 똑같은지 파악한다.
    - x,y 중에 하나라도 차이가 똑같은 경우의 수가 있다면 평행한 두 개의 선을 만들 수 있다.

3. 코드 설계

  • 직관적으로 생각하기
    - const dots1And2Slope = (dots[0][0] - dots[1][0]) / (dots[0][1] - dots[1][1])
    - 기울기를 전부 구한 다음에, 비교해서 return 하기

4. 코드 구현

function solution(dots) {
  const dots1And2Slope = (dots[0][0] - dots[1][0]) / (dots[0][1] - dots[1][1])
  const dots3And4Slope = (dots[2][0] - dots[3][0]) / (dots[2][1] - dots[3][1])
  const dots1And3Slope = (dots[0][0] - dots[2][0]) / (dots[0][1] - dots[2][1])
  const dots2And4Slope = (dots[1][0] - dots[3][0]) / (dots[1][1] - dots[3][1])
  const dots1And4Slope = (dots[0][0] - dots[3][0]) / (dots[0][1] - dots[3][1])
  const dots2And3Slope = (dots[1][0] - dots[2][0]) / (dots[1][1] - dots[2][1])

  if (
    dots1And2Slope === dots3And4Slope ||
    dots1And3Slope === dots2And4Slope ||
    dots1And4Slope === dots2And3Slope
  )
    return 1
  else return 0
}

다른 사람 풀이

function solution(dots) {
  const leans = []

  for(let i = 0; i < dots.length; i++) {
      const dotA = dots[i];
      for(let j = i + 1; j < dots.length; j++) {
          const dotB = dots[j]
          const lean = (dotB[1] - dotA[1])  / (dotB[0] - dotA[0])

          if(leans.includes(lean)) return 1
          else leans.push(lean)
      }
  }

  return 0;
}

회고

이번에도 1시간 정도 고민해보다가 안 풀리면 다음 날 다시 시도해 볼 생각이었다. 그렇게 조급함을 내려놓고 차분하게 생각을 거듭하다 보니까, 기존 방법과는 다른 해결책이 떠올랐다. 앞으로도 계속 풀리 때까지 이 방법으로 계속 시도해보자.

profile
데이터리터러시를 중요하게 생각하는 프론트엔드 개발자

0개의 댓글