프로그래머스 0단계 - 직사각형 넓이 구하기

이종현·2024년 1월 11일
0

코딩테스트

목록 보기
11/24
post-thumbnail

문제 설명

2차원 좌표 평면에 변이 축과 평행한 직사각형이 있습니다. 직사각형 네 꼭짓점의 좌표 [[x1, y1], [x2, y2], [x3, y3], [x4, y4]]가 담겨있는 배열 dots가 매개변수로 주어질 때, 직사각형의 넓이를 return 하도록 solution 함수를 완성해보세요.


제한사항

  • dots의 길이 = 4
  • dots의 원소의 길이 = 2
  • 256 < dots[i]의 원소 < 256
  • 잘못된 입력은 주어지지 않습니다.

입출력 예

dotsresult
[[1, 1], [2, 1], [2, 2], [1, 2]]1
[[-1, -1], [1, 1], [1, -1], [-1, 1]]4

입출력 예 설명

입출력 예 #1

  • 좌표 [[1, 1], [2, 1], [2, 2], [1, 2]] 를 꼭짓점으로 갖는 직사각형의 가로, 세로 길이는 각각 1, 1이므로 직사각형의 넓이는 1 x 1 = 1입니다.

입출력 예 #2

  • 좌표 [[-1, -1], [1, 1], [1, -1], [-1, 1]]를 꼭짓점으로 갖는 직사각형의 가로, 세로 길이는 각각 2, 2이므로 직사각형의 넓이는 2 x 2 = 4입니다.

1. 문제 이해

  • 일단 직사각형의 가장 왼쪽 위에 부터 시작해서 시계방향으로 좌표가 정해지는 것으로 이해했다.
  • input은 크지 않기 때문에 시간복잡도는 문제 없다고 생각한다.

2. 접근 방법

  • 직관적으로 생각하기
    • 시계방향으로 좌표가 정해지기 때문에 dots[0]과 dots[1], dot[2]과 dot[3]을 짝지으면 될 것 같다.
    • 그리고 dots[0]과 dots[1]의 x좌표의 차이, dot[2]과 dot[3]의 y좌표의 차이를 계산하면 될 것 같다.
    • 그리고 그렇게 나온 두 개의 값을 곱한다. 이때 결과값이 음수일 경우 절대값을 이용한다.

3. 코드 설계

  • 직관적으로 생각하기
    • return Math.abs((dots[1][0] - dots[0][0]) * (dots[2][1] - dots[3][1]))

4. 코드 구현

function solution(dots) {
  const result = Math.abs((dots[1][0] - dots[0][0]) * (dots[2][1] - dots[1][1]))
  return result
}

다른 사람 풀이

function solution(dots) {
  return Math.abs(
    (Math.max(...dots.map((dot) => dot[0])) -
      Math.min(...dots.map((dot) => dot[0]))) *
      (Math.max(...dots.map((dot) => dot[1])) -
        Math.min(...dots.map((dot) => dot[1])))
  );
}

회고

입출력 예시를 보여준 걸로 그냥 시계 방향으로 좌표가 제시될 거라 추측했던 게 오판이었다. 실제로 코드 제출하면서 테스트 돌려보니까 전부 오류가 발생했다.

다른 사람 풀이를 확인해보면 x좌표의 가장 큰 값과 작은 값의 차이와 그리고 y좌표의 가장 큰 값과 작은 값의 차이를 곱하고 음수일 수도 있으니 절대값으로 마무리하는 방식이다.

이 방식으로 해결했어야 하는데 너무 성급했다. 반성한다ㅜ

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

0개의 댓글