본문 바로가기

프로그래머스

[JAVA] 단체사진 찍기(2017 카카오코드 본선) - 프로그래머스

https://programmers.co.kr/learn/courses/30/lessons/1835

 

코딩테스트 연습 - 단체사진 찍기

단체사진 찍기 가을을 맞아 카카오프렌즈는 단체로 소풍을 떠났다. 즐거운 시간을 보내고 마지막에 단체사진을 찍기 위해 카메라 앞에 일렬로 나란히 섰다. 그런데 각자가 원하는 배치가 모두

programmers.co.kr

 

-- 문제 풀이

1. 순열 구하기

2. 조건 값 계산

 

class Solution {
    static int answer = 0;
    static char[] people = {'A', 'C', 'F', 'J', 'M', 'N', 'R', 'T'};
    
    public int solution(int n, String[] data) {
        answer = 0;
        char[] ch = new char[8];
        boolean[] visit = new boolean[8];
        dfs(0, ch, visit, n, data);
        return answer;
    }
    
    void dfs(int k, char[] ch, boolean[] visit, int n, String[] data){
        if(k==8){
        	for(int i=0; i<n; i++) {
        		int interval = 0;
        		int cnt = 0;
                for(int j=0; j<8; j++){
                    if(ch[j] == data[i].charAt(0) || ch[j] == data[i].charAt(2)){
                        cnt++;
                        continue;
                    }
                    if(cnt==1){
                        interval++;
                    }else if(cnt==2){
                        break;
                    }
                }
        		if(data[i].charAt(3)=='='){
                    if(interval != data[i].charAt(4) - '0') return;
                }else if(data[i].charAt(3)=='<'){
                    if(interval >= data[i].charAt(4) - '0') return;
                }else if(data[i].charAt(3)=='>')
                    if(interval <= data[i].charAt(4) - '0') return;
        	}
        	answer++;
        	return;
        }
        
        for(int i=0; i<8; i++){
            if(!visit[i]){
                ch[k] = people[i];
                visit[i] = true;
                dfs(k+1,ch,visit,n,data);
                visit[i] = false;
            }
        }
    }
}
반응형