developerU

[프로그래머스] level2 단체사진 찍기 (java) 본문

Algorithm/Programmers

[프로그래머스] level2 단체사진 찍기 (java)

developerU 2022. 6. 30. 02:31

문제링크

 

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

 

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

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

programmers.co.kr

 

풀이 방법

1. 순열을 이용

   8가지 경우의 수를 모두 나열

2. 각각의 경우에서 조건이 맞는지 체크

   

* 시간 초과 주의 : 반대의 경우일 때 백트래킹 사용

 

내 코드

import java.util.*;

class Solution {
    char[] friends = {'A', 'C', 'F', 'J', 'M', 'N', 'R', 'T'};
    char[] res = new char[8];
    int answer = 0;
    int N;
    String[] data;
    
    public int solution(int n, String[] data) {
        N = n;
        this.data = data;
        permu(0, 0);
        
        return answer;
    }
    
    public void permu(int cnt, int flag){
        if(cnt == 8){
             
            if(check()) answer++;
            return;
        }
        
        for(int i=0; i<8; i++){
            if((flag & 1<<i) != 0) continue;
            res[cnt] = friends[i];
            permu(cnt+1, flag | 1<<i);
        }
    }
    
    public boolean check(){
        int start = 0;
        int third = 0;
        
        for(int i=0; i<N; i++){
            for(int j=0; j<8; j++){
                if(data[i].charAt(0) == res[j]) start = j;
                if(data[i].charAt(2) == res[j]) third = j;
            }

            int cha = Math.abs(start-third)-1;
            int num = data[i].charAt(4)-'0';
            
            if(data[i].charAt(3) == '='){
                if(cha != num) return false;
            }
            else if(data[i].charAt(3) == '<'){
                if(cha >= num) return false;
            }
            else if(data[i].charAt(3) == '>'){
                if(cha <= num)  return false;
            }
        }
        
        return true;
    }
    
}
Comments