본문 바로가기

Algorithm

[Algorithm] Kotlin / Programmers Lv0 [ 평행 ]

[ Algorithm Link ]

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 


 

최종 코드 미리보기
class Solution {
    fun solution(dots: Array<IntArray>): Int {
    var answer = 0

    (dots.indices).map { dotA ->
        var excluedDotA = dots.filterIndexed { index, _ -> index !=dotA }
        excluedDotA.mapIndexed { dotBIndex, dotB ->
            var line = listOf(dots[dotA], dotB)
            var otherLine = excluedDotA.filterIndexed { index, _ -> index != dotBIndex }

            fun inclination(arr : List<IntArray>): Double {
                var x = arr[1][0].toDouble() - arr[0][0].toDouble()
                var y = arr[1][1].toDouble() - arr[0][1].toDouble()

                return y / x
            }
            if (inclination(line) == inclination(otherLine)) {
                answer = 1
            }
        }
    }
    return answer
}
}

[ 작성 코드 ]

  • 점마다 해당 점을 제외한 나머지 점과 직선을 이루게 만들고, 두 점을 제외한 나머지 점을 직선으로 이어서 기울기가 일치하는 경우 1을 리턴하도록 함
  • 🟥 testCase2 의 경우 기울기가 소숫점이 나와서 기울기에 타입은 double을 사용.

 

 

 

 

제출코드 1 - 테스트 1, 10, 12, 14 실패

 

더보기

1. 직선간의 거리를 통해서 값을 구해보려고 시도함.

 

 

[ 제출 코드 ]

class Solution {
    fun solution(dots: Array<IntArray>): Int {
    var answer = 0

    (dots.indices).map { dotA ->
        var tt = dots.filterIndexed { index, _ -> index !=dotA }
        tt.mapIndexed { dotBIndex, dotB ->
            var line = listOf(dots[dotA], dotB)
            var outerLine = tt.filterIndexed { index, _ -> index != dotBIndex }
            var lengthA_X = arrayOf<IntArray>(intArrayOf(Math.abs(line[0][0]-outerLine[0][0]),Math.abs(line[0][1]-outerLine[0][1])))
            var lengthA_Y = arrayOf<IntArray>(intArrayOf(Math.abs(line[0][0]-outerLine[1][0]),Math.abs(line[0][1]-outerLine[1][1])))
            var lengthB_X = arrayOf<IntArray>(intArrayOf(Math.abs(line[1][0]-outerLine[0][0]),Math.abs(line[1][1]-outerLine[0][1])))
            var lengthB_Y = arrayOf<IntArray>(intArrayOf(Math.abs(line[1][0]-outerLine[1][0]),Math.abs(line[1][1]-outerLine[1][1])))

            var compare = listOf( lengthA_X,lengthA_Y,lengthB_X,lengthB_Y)
            compare.forEachIndexed{ index, intArrays ->
                (compare.indices-index).map{
                    println("it = $it , compare[index] = ${compare[index][0].toList()}, compare[it] = ${compare[it][0].toList()}," )
                    if ( compare[index][0].contentEquals (compare[it][0])) {
                        answer = 1
                        println("answer = $answer")
                    }
                }
            }
            println(" lengthAX AY BX BY ${lengthA_X[0].toList()} ${lengthA_Y[0].toList()} ${lengthB_X[0].toList()} ${lengthB_Y[0].toList()}")
            println("${dotA} = ${line[0].toList()} ${line[1].toList()}")

        }
    }
    return answer
}
}

[ 원인 ]

1. [ A-B] [C-D] 와 같이 직선을 그었을 때, 점 간의 거리 [A-B][C-D] 직선 사이의 거리를 구할 순 없었다 ( 직선이 평행하지 않음에도, 직선 점 간의 거리를 대각선으로 잇는 선의 길이가 일치할 때도 1을 리턴하는 문제 )

 

2. 점 간의 거리가 일치하지 않아도 평행할 수 있다.

 

[ 해결방법 ]

직선의 기울기를 구하면 해결된다. 

 

 

 

 

알고리즘 회고

 

알고리즘을 풀 만한 문법, 전반적인 메서드에 대한 개념이 확립되지 않은 상태로 머리 맞대고 억지로 풀고 있다는 생각이 들었다. 노가다로라도 풀고나서 다른 사람의 깔끔한 풀이를 보면서 비교 하다보다보면 사고력도 기를 수 있으려나 했는데, 시간 소요도 많고 미련한 방법같다.

 

당분간은 알고리즘을 풀지 않고 언어 전반적인 학습을 먼저 한 다음, 알고리즘을 다시 풀 예정.

 

다시 알고리즘을 풀때도, 어느 수준(Lv2~3)전 까지는 당장 해결이 안되는 부분이나 빠르게 답이 나오지 않을 것 같은 상황에서는 다른 사람의 풀이를 참고하거나 바로 검색을 하는 방식으로 문제 푸는 방법을 바꿔야 될 것 같다. 

 

 

 

 

 

 


[Reference]