[문제설명]
한국중학교에 다니는 학생들은 각자 정수 번호를 갖고 있습니다. 이 학교 학생 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문이라 그다지 성능 비교할 게 없다...
확실히 연습문제가 카카오 문제보단 쉬운 것 같다..ㅎ
요즘 코딩테스트에 재미가 들려서, 점심시간 때 밥먹고 남은 시간에 조금씩 끄적이고 있는데 뭔가 아쉬워서 스터디를 한 번 알아볼까 고민이 된다.