Don't give up!

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

Coding Test/Programmers

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

Heang Lee 2021. 6. 21. 19:15

코딩테스트 연습 - 단체사진 찍기 | 프로그래머스 (programmers.co.kr)

 

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

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

programmers.co.kr

어떻게 생각하고 문제를 풀었는가?

프렌즈들은 A, C, F, J, M, N, R, T로 정해져 있습니다. 따라서 8!=40320가지의 케이스를 미리 생성해둔 후, 조건을 만족하지 않는 케이스들을 제거하여 문제를 해결할 수 있을 것이라고 생각하였습니다.

코드

import java.util.*;
class Solution {
    ArrayList<String> cases = new ArrayList<>();
    int idx=0;
    public int solution(int n, String[] data) {
        makecases(0,"");
        for(var query : data){
            char first = query.charAt(0);
            char last = query.charAt(2);
            char type = query.charAt(3);
            int value = query.charAt(4)-48;
            switch(type){
                case '=':
                    cases.removeIf(x -> (Math.abs(x.indexOf(first)-x.indexOf(last))-1!=value));
                    break;
                case '<':
                    cases.removeIf(x -> (Math.abs(x.indexOf(first)-x.indexOf(last))-1>=value));
                    break;
                case '>':
                    cases.removeIf(x -> (Math.abs(x.indexOf(first)-x.indexOf(last))-1<=value));
                    break;
            }
        }
        
        return cases.size();
    }
    void makecases(int len, String str){
        if(len==8){
            cases.add(str);
            return;
        }
        if(str.indexOf('A')<0) makecases(len+1,str+'A');
        if(str.indexOf('C')<0) makecases(len+1,str+'C');
        if(str.indexOf('F')<0) makecases(len+1,str+'F');
        if(str.indexOf('J')<0) makecases(len+1,str+'J');
        if(str.indexOf('M')<0) makecases(len+1,str+'M');
        if(str.indexOf('N')<0) makecases(len+1,str+'N');
        if(str.indexOf('R')<0) makecases(len+1,str+'R');
        if(str.indexOf('T')<0) makecases(len+1,str+'T');
    }
}

 

단체사진을 찍는 배치를 String으로 정의하였고, 모든 케이스를 생성하는 메서드 makecases를 재귀함수로 선언하였습니다. String에 각 캐릭터가 배치되어 있지 않다면 문자열에 캐릭터 문자를 추가한 후, 모든 캐릭터가 추가되었다면 ArrayList에 추가하는 방식입니다.

ArrayList의 removeIf 함수는 조건을 만족하는 원소들을 모두 제거합니다.

Predicate<T>인터페이스를 매개변수로 받는데, 주어진 조건의 캐릭터 간격을 |(캐릭터1의 위치) - (캐릭터 2의 위치)|-1로 구한 후 =,>,<를 만족하지 않는 원소를 지울 수 있도록 적절한 조건문을 람다식으로 작성하였습니다.