알고리즘 CODEKATA 42 (삼총사)

오리너구리·2024년 6월 19일
0

CODEKATA

목록 보기
41/57
post-thumbnail

문제 설명

한국중학교에 다니는 학생들은 각자 정수 번호를 갖고 있습니다. 이 학교 학생 3명의 정수 번호를 더했을 때 0이 되면 3명의 학생은 삼총사라고 합니다. 예를 들어, 5명의 학생이 있고, 각각의 정수 번호가 순서대로 -2, 3, 0, 2, -5일 때, 첫 번째, 세 번째, 네 번째 학생의 정수 번호를 더하면 0이므로 세 학생은 삼총사입니다. 또한, 두 번째, 네 번째, 다섯 번째 학생의 정수 번호를 더해도 0이므로 세 학생도 삼총사입니다. 따라서 이 경우 한국중학교에서는 두 가지 방법으로 삼총사를 만들 수 있습니다.

한국중학교 학생들의 번호를 나타내는 정수 배열 number가 매개변수로 주어질 때, 학생들 중 삼총사를 만들 수 있는 방법의 수를 return 하도록 solution 함수를 완성하세요.


제한사항

  • 3 ≤ number의 길이 ≤ 13
  • 1,000 ≤ number의 각 원소 ≤ 1,000
  • 서로 다른 학생의 정수 번호가 같을 수 있습니다.

내 풀이

class Solution {
    fun solution(number: IntArray): Int {
        var count = 0

        for(a in number.indices){
            for(b in number.indices){
                for(c in number.indices){
                    if(a < b && b < c){
                         if(number[a]+number[b]+number[c]==0){
                         count++
                        }            
                    }

                }
            }

        }

        return count
    }
}

이제 문제가 짱 길어짐.. 비몽사몽해서 앉아서 글 읽으니까 문제 이해하는데에도 오래걸린다.

배열안의 숫자를 더 해야하는데 반복문으로 하는 방법 밖에 모르겠어서

삼중으로 반복문 써서 하는게 과연 맞을까 반신반의해서 일단 해봤는데 되긴했다..

반복문 돌면서 인덱스가 겹치는 애들은 빼야하니까 a<b<c 가 만족되는 경우에만

해당 인덱스 값을 더하고 0이되면 count를 1씩 올려줬다..


다른 사람 풀이

class Solution {
    fun solution(number: IntArray): Int {

        var threeMusketeersCount = 0

        for ((i,n) in number.withIndex()) {
            for ((j, m) in number.withIndex()) {
                for ((k, l) in number.withIndex()) {
                    if ((i < j) && (j < k)) {
                        if (n + m + l == 0) {
                            threeMusketeersCount++
                        }
                    }
                } 
            }
        }
        return threeMusketeersCount
    }
}

이 분도 비슷하지만 for문에서 withIndex()를 써서 보기에 좀더 단순한거같기도?

class Solution {
    fun solution(number: IntArray): Int {
        var answer: Int = 0
        for(i in 0 .. number.size-3){
            for(j in i+1 .. number.size-2){
                for(k in j+1 .. number.size-1){
                    if(number[i]+number[j]+number[k] == 0) answer++
                }
            }

        }
        return answer
    }
}

이 분은 나랑 비슷하게 삼중으로 반복문을 돌리지만

반복문 범위를 지정할 때

시작범위를 i , i+1 , j +1 로,

끝범위를 number.size에서 -3, -2 -1 해주는 식으로 반복 범위를 줄여서 더 단순하게 했다.


피드백

나도 반복문 범위 지정을 더 신중하게 했으면 좋았을 것 같다.

profile
오리너구리입니다

0개의 댓글