프로그래머스 알고리즘 문제 풀이 - 카카오 2022 - 4번 문제풀이

zio도미닉·2022년 1월 30일
0

4. 양궁대회

알게 된점

  • 객체를 복사하는 유형은 깊은 복사, 얕은 복사가 있음
  • 깊은 복사 : 복사된 배열이나 원본배열이 변경될 때 서로 간의 값은 바뀌지 않음
	// 방법 1. 
        int[] a = { 1, 2, 3, 4 };
        int[] b = new int[a.length]; 
        for (int i = 0; i < a.length; i++) {
            b[i] = a[i];
        }
        
	// 방법 2. clone() 메소드 이용
        int[] a = { 1, 2, 3, 4 };
        int[] b = a.clone();
   
   	// 방법 3. Arrays.copyOf()
        int[] a = { 1, 2, 3, 4 };
        int[] b = Arrays.copyOf(a, a.length);
        
	// 방법 4.  Arrays.copyOfRange()
         int[] a = { 1, 2, 3, 4 };
        int[] b = Arrays.copyOfRange(a, 1, 3); //[2,3]
  • 얕은 복사 : 복사된 배열이나 원본배열이 변경될 때 서로 간의 값이 같이 변경
        int[] a = { 1, 2, 3, 4 };
        int[] b = a;

해결방법

  • 백트래킹 & DFS

소스코드

class Solution {
    static int nn;
    static int apeech[];
    static int lion[];
    static int res[]={-1};
    static int max=-10000;
    
    public void dfs(int l) {
        if (l==nn) { // 종료
            int a_point=0;
            int l_point=0;
            for (int i=0;i<11;i++) {
                if (apeech[i]!=0 || lion[i]!=0) {
                    if (lion[i]>apeech[i]) {
                        l_point+=10-i; // 라이언이 점수 가져감
                    }else {
                        a_point+=10-i;
                    }
                }
            }
            
            if (l_point>a_point) { // 값 갱신
                if (l_point-a_point>=max) {
                    max=l_point-a_point;
                    res=lion.clone();
                }
            }
            
            
        }else {
            for (int j=0;j<11;j++) {
                if (lion[j]<=apeech[j]) { //작거나 같을경우에만 돌림, 라이언이 더 커지면 dfs를 더 돌 필요없음.
                    lion[j]++;
                    dfs(l+1);
                    lion[j]--;
                } else {
                    break;
                }
            }
        }
        
        
    }
    
    public int[] solution(int n, int[] info) {
        // int[] answer = {};
        apeech=info.clone();
        nn=n;
        lion=new int[11];
        dfs(0);
        return res;
    }
}

참고

profile
BackEnd Developer

0개의 댓글