본문 바로가기
Algorithm/Programmers

[Programmers] 단체사진 찍기

by J4J 2021. 3. 13.
300x250
반응형

문제

 

2017 카카오코드 본선 > 단체사진 찍기

 

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

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

programmers.co.kr

 

 

아이디어

 

이번 문제는 여러가지 아이디어 없이 순열이라는 키워드만 가지고 풀 수 있는 문제였습니다.

 

카카오프렌즈들의 총 인원수는 8명이었기 때문에 순열을 이용해도 문제가 없었고 순열을 통해 배열된 값을 가지고 data의 조건에 맞는지 체크만 해주면 풀 수 있는 문제입니다.

 

아이디어를 정리하면 다음과 같습니다.

 

1. 카카오프렌즈들을 이용한 순열 구하기

2. data의 조건에 맞는지 확인

 

 

구현 코드 (Java)

 

class Solution {
    static int res;
    
    public int solution(int n, String[] data) {
        res = 0;
        
        String array[] = new String[]{"A", "C", "F", "J", "M", "N", "R", "T"};
        makeP(array, 0, data);
        
        return res;
    }
    
    public static void makeP(String array[], int n, String data[]) { // 순열
        if(n >= array.length) {
            boolean isPossible = true; // data의 조건에 모두 만족하는지 확인
            
            for(int i=0; i<data.length; i++) {
                String target = data[i];
                String first_char = target.substring(0, 1); // 첫 번째 문자
                String second_char = target.substring(2, 3); // 두 번째 문자
                int length = Integer.valueOf(target.substring(4))+1; // 조건의 크기
                
                int first_index = -1; // 첫 번째 문자 위치
                int second_index = -1; // 두 번째 문자 위치
                for(int j=0; j<array.length; j++) {
                    if(array[j].equals(first_char)) {
                        first_index = j;
                    }
                    
                    if(array[j].equals(second_char)) {
                        second_index = j;
                    }
                }
                
                String condition = target.substring(3, 4); // 관계 조건
                switch(condition) { // 조건 검사
                    case "=":
                        if(Math.abs(first_index - second_index) != length) {
                            isPossible = false;
                        }
                        break;
                        
                    case ">":
                        if(Math.abs(first_index - second_index) <= length) {
                            isPossible = false;
                        }
                        break;
                        
                    case "<":
                        if(Math.abs(first_index - second_index) >= length) {
                            isPossible = false;
                        }
                        break;
                }
                
                if(!isPossible) { // 하나라도 조건이 맞지 않다면 종료
                    break;
                }
            }
            
            if(isPossible) {
                res++;
            }
            
            return;
        }
        
        for(int a=n; a<array.length; a++) {
            String temp = array[a];
            array[a] = array[n];
            array[n] = temp;
            
            makeP(array, n+1, data);
            
            temp = array[a];
            array[a] = array[n];
            array[n] = temp;
        }
    }
}

 

 

읽어주셔서 감사합니다.

728x90
반응형

'Algorithm > Programmers' 카테고리의 다른 글

[Programmers] 문자열 압축  (0) 2021.03.17
[Programmers] 보행자 천국  (0) 2021.03.14
[Programmers] 외벽 점검  (0) 2021.03.12
[Programmers] 순위 검색  (0) 2021.03.11
[Programmers] 합승 택시 요금  (0) 2021.03.10

댓글