프로그래머스 직사각형 넓이 구하기 코틀린
https://school.programmers.co.kr/learn/courses/30/lessons/120860
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
1. 1차 아이디어
val dots = arrayOf(Pair(1, -1), Pair(-1, -1), Pair(1, 1),Pair(-1,1))
var width = 0
var height = 0
for(i in 0 until dots.size-1) {
val (x1,y1) = dots[i]
val (x2 , y2) = dots[i+1]
if(x1 > x2){
width = Math.abs((x1-x2))
}else{
width = Math.abs(x2 - x1)
}
if(y1 > y2){
height = Math.abs((y1-y2))
}else{
height = Math.abs(y2 - y1)
}
//이후 업데이트 검사 코드
}
x1과 x2를 비교해서 큰 값 - 작은값의 상황을 각 너비,높이를 구한다.
그 다음에 다시 width와 height의 최신화를 비교해서 업데이트를 해주려 했다.
math.abs()는 ()값을 절대값으로 풀어주는 함수다.
이전 로직들을 구성하면서 최대한 기본기능만 사용하도록 노력했는데 math.abs를 사용한 이유는 절대값을 구하는 과정이 쉽지만 코드가 복잡해지고 길어지기 때문이었다.
각 값이 0보다 큰지 작은지를 판단한 후 0보다 작다면 *-1을 해주면 되는 간단한 방식을 코딩 테스트를 할 때 과연 요구할지 의문이었기 때문이다.
그런데 그렇게 푼다면 문제는 풀리겠지만, 너무 너무 코드가 길어진다.
이렇게까지 코드가 길어질 이유가 필요한가?싶어서 해당 코드의 설계를 고민하던 중
애초에 x1과 x2의 크기 우열을 비교할 필요가 있나?라는 의문이 들었다.
x1-x2이든 x2-x1이든 어쨋든간 제일 큰 값만 업데이트를 해주면 되는게 아닌가?
그렇게 나온 결과가 이것이다
fun main() {
val dots = arrayOf(Pair(1, 1), Pair(2, 1), Pair(2, 2),Pair(1,2))
var width = 0
var height = 0
for(i in 0 until dots.size-1) {
val (x1,y1) = dots[i]
val (x2 , y2) = dots[i+1]
var widthX = Math.abs(x1-x2)
var heightY = Math.abs((y1-y2))
if (widthX>width){
width=widthX
println("현재 길이 : ${width}")
}
if (heightY>height){
height=heightY
println("현재 높이 : ${height}")
}
}
println("넓이 : ${width*height}")
}
class Solution {
fun solution(dots: Array<IntArray>): Int {
var width = 0
var height = 0
for(i in 0 until dots.size-1){
val(x1,y1) = dots[i]
val(x2,y2) = dots[i+1]
var widthX = Math.abs(x1-x2)
var heightY = Math.abs(y1-y2)
if (widthX>width){
width=widthX
}
if (heightY>height){
height=heightY
}
}
return width*height
}
}
참고 블로그
https://codechacha.com/ko/kotlin-convert-negative-to-positive/
Kotlin - 음수를 양수로 변환, math.abs()
음수를 양수로 변환하는 방법을 소개합니다. `abs()`는 인자로 입력된 수의 절대값을 리턴합니다. 예를 들어, `-22`를 인자로 전달하면 22를 리턴합니다. `abs()`는 int 뿐만 아니라 Long, Double 등을 자료
codechacha.com