Intro
- 오늘도 알고리듬문제를 2개 풀었다. 첫번재 문제는 배열에서 나보다 큰 키를 가진사람의 숫자를 return 해주는문제였다. 이 문제는 편하게 해결. 그런데 2차원 좌표평면에서 직사각형의 넓이를 구하는문제에서 생각보다 잘안풀렸다.
문제설명(프로그래머스 알고리듬 문제)
-
직사각형 넓이 구하기
- 2차원 좌표 평면에 변이 축과 평행한 직사각형이 있습니다. 직사각형 네 꼭짓점의 좌표 [[x1, y1], [x2, y2], [x3, y3], [x4, y4]]가 담겨있는 배열 dots가 매개변수로 주어질 때, 직사각형의 넓이를 return 하도록 solution 함수를 완성해보세요.
- 제한사항
- dots의 길이 = 4
- dots의 원소의 길이 = 2
- 256 < dots[i]의 원소 < 256
- 잘못된 입력은 주어지지 않습니다.
- 입출력 예
dots: [[1, 1], [2, 1], [2, 2], [1, 2]]
result: 1
dots: [[-1, -1], [1, 1], [1, -1], [-1, 1]]
result: 4
-
자세한 문제설명은 여기
내 접근방법
- 처음에는 좌표평면에 변이 축과 평행하다는 것을 인지하지 못했다.(문제를 잘 풀기위해서는 문제를 잘 읽어야되는데 그러질 않았다.. 반성..!) 그래서 아무 좌표나 잡고 아주 단순하게 입출력 예에서 나온 그대로 dots[1][0] - dots[0][0] 을 한 변의 길이로 잡는 단순한 행동을했다. 그리고 돌렸는데 왠걸? 답이 틀렸다고나온다.
- 그래서 생각해보니 좌표는 랜덤하게 찍히는데 아무생각없이 아무좌표 두개 불러다가 x값 구하고 y값구하고해서 계산을 하려고하니 올바른 답이 나올리 만무했다. 그리고 좌표값에는 -도 포함되어있는데 이부분이 전혀 고려되지 않았다. 그래서 이부분은 abs를 사용하여 절대값계산으로 처리해야겠다고 생각했다.
- 그 후 문제를 다시한번 읽어보니 변이 축과 평행하다고 했다. 그 말은 x든 y든 같은 값이 반드시 존재할 수 밖에 없는것이고, 그렇기때문에 이것만 걸러주고 abs를 사용하면 x, y의 변 길이를 구할 수 있게된다는 것이다. 유레카!
- 위의 내용을 적용한 수식은 아래와 같다.
import kotlin.math.abs
class Solution {
fun solution(dots: Array<IntArray>): Int {
var answer: Int = 0
var x : Int = 0
var y : Int = 0
for(i in 0 until dots.size - 1) {
if(dots[i][0] != dots[i+1][0]) {
x = abs(dots[i][0] - dots[i+1][0])
}
if(dots[i][1] != dots[i+1][1]) {
y = abs(dots[i][1] - dots[i+1][1])
}
}
answer = x*y
return answer
}
}
Outro
- 문제를 잘 읽자! 정말 잘 읽어야 한다. 취직후에 일할때에도 문제를 잘 파악해야 헛수고를 하지 않을 수 있겠다는것을 다시금 깨닫는 시간이었다.
- 너무 컴파일러만믿고 내 머리를 쓰지 않으려는 행동을 멈춰야겠다. 오류나면 컴파일러가 잡아주고, 클레스 안에 뭐가있는지 어떻게쓰는지 IDE가 너무 좋아져서 다 알려주는데 이러다보니 내가 직접 생각하는 것보다 일단 그냥 돌려보자는 무책임한 생각(난 이게 내 코드에대한 무책임한 생각이라고 느껴졌다)이 들었고, 그러지 말아야겠다고 생각했다. 내 머리속에서 검증이 끝난 코드를 컴퓨터가 테스트하도록 도와주는 형태여야 내가 이해하고 쓰는 코드가 되기 때문이다. 끗!