알고리즘

프로그래머스 - 삼총사

Heidong 2022. 10. 15. 02:32
반응형

 

 

내 풀이

public class P_43 {
	
	public static int ans = 0;
	
	public int solution(int[] number) {
		int[] list = new int[number.length-1];
		
		if(number.length < 3) { // 더이상 더할 수가 없을 경우 탈출
			return ans;
		}
		
		for(int i=0; i<number.length; i++) {
			if(i+1 != number.length) {
				list[i] = number[i+1];
			}
			for(int j=i+2; j<number.length; j++) {
				if(i == number.length) {
					break;
				}
				int x = number[0] + number[i+1] + number[j];
				if(x == 0) {
					ans++;
				}
			}
		}	
		return solution(list);	
	}

	public static void main(String[] args) {
		// 삼총사  
		P_43 p = new P_43();
		int[] number = {-3, -2, -1, 0, 1, 2, 3};
		System.out.println(p.solution(number));	
	}

}

 

재귀로 풀었다.

재귀로 돌리면서 ans 반환값을 인자로 넣어서 빼려고 했더니 프로그래머스에서 매개 변수는 int형 배열 하나만 받게끔 되어 있었다.

그래서 어쩔 수 없이 static으로 공용 변수로 빼서 사용했다.

실무에서는 static 변수는 사용하지 않는게 좋다. 꼭 써야한다면 private로 변수 못건들게 막아놓고 getter, setter 메소드 정의를 해주는게 좋다.

 

총 3개의 요소를 더하는게 포인트라서 재귀 탈출의 조건을 요소의 갯수 카운팅으로 줬다.

풀이 방식은 순열을 생각하면서 풀었다.

결국은 원소 첫번째 부터 3개씩 한번씩 다 찍어보면 풀 수 있다.

가장 간단한 방법으론 for문 3중첩인데 아무래도 3중첩으로 풀고 싶진 않았다.

그래서 생각한건 어차피 매개변수로 int형 배열을 받으니까 이미 계산이 끝난 요소는 빼고 남은 요소들이 있는 배열을 넘겨주면 for문을 3중첩까지 할 필요는 없을 것 같았다. 

그렇게 조건에 걸릴때까지 재귀를 하면 답을 구할 수 있다.

 

순열이란 ? 

서로 다른 n개의 원소에서 r개를 중복없이 순서에 상관있게 
선택하는 혹은 나열하는 것을 순열이라고 한다.

 

 

다른 사람 풀이

class Solution {
    public int solution(int[] number) {
        int answer = 0;
        int n = number.length;
        for(int i = 0; i < n; i++) {
            for(int j = i + 1; j < n; j++) {
                for(int k = j + 1; k < n; k++) {
                    if(number[i] + number[j] + number[k] == 0)
                        answer++;
                }
            }
        }
        return answer;
    }
}

아직 문제가 나온지 하루밖에 되지 않아서 괜찮아 보이는 풀이법이 안보인다.

나중에 추가할 예정

가장 많은 사람들이 푼 방식인 3중첩 for문이다.

3개의 요소를 더하는 것이니 말 그대로 반복문을 3번 돌리면 된다...

반응형