[프로그래머스] 삼총사

DYKO·2023년 1월 10일
0

코딩 테스트

목록 보기
2/3

🔗프로그래머스 문제로 이동하기

[문제설명]

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

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


[제한사항]

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


[제출 답안]

class Solution {
    public int solution(int[] number) {
        int answer = 0;

        for(int myIdx = 0; myIdx < number.length; myIdx++){
            for(int secondIdx = myIdx + 1; secondIdx < number.length; secondIdx++){
                int thirdValue = -1 * (number[myIdx] + number[secondIdx]);
                for(int thirdIdx = secondIdx + 1; thirdIdx < number.length; thirdIdx++){
                    if(number[thirdIdx] == thirdValue) answer++;
                }
            }
        }

        return answer;
    }
}

요리조리 3중 for문을 안 쓸 수 있는 방법을 찾다가 그냥 3중 for문으로 구현...


[다른 사용자 답안]

class Solution {
    public int solution(int[] number) {
        int answer = 0;

        for(int i=0; i<number.length-2; i++){
            for(int j=i+1; j<number.length-1; j++){
                for(int k=j+1; k<number.length; k++){
                    if(number[i]+number[j]+number[k]==0) answer++;
                }
            }
        }

        return answer;
    }
}

생각해보니 중복하는 index는 굳이 비교할 필요 없기 때문에 첫 번째, 두 번째 for문 범위를 length에서 -2, -1로 지정해주는게 맞다. 그리고 굳이 thirdValue 변수를 선언하지 않고 바로 비교하는 것이 가독성도 좋고 쓸데 없는 변수 선언을 제거해줄 수 있다.


[수정 답안]

class Solution {
    public int solution(int[] number) {
        int answer = 0;

        for(int firstIdx = 0; firstIdx < number.length -2; firstIdx++){
            for(int secondIdx = firstIdx + 1; secondIdx < number.length - 1; secondIdx++){
                for(int thirdIdx = secondIdx + 1; thirdIdx < number.length; thirdIdx++){
                    if(number[firstIdx] + number[secondIdx] + number[thirdIdx] == 0) answer++;
                }
            }
        }

        return answer;
    }
}

내 답변, 다른 사용자 답변 모두 대부분 3중 for문이라 그다지 성능 비교할 게 없다...


사담

확실히 연습문제가 카카오 문제보단 쉬운 것 같다..ㅎ
요즘 코딩테스트에 재미가 들려서, 점심시간 때 밥먹고 남은 시간에 조금씩 끄적이고 있는데 뭔가 아쉬워서 스터디를 한 번 알아볼까 고민이 된다.

profile
엔지니어가 되는 그 날 까지!

0개의 댓글