Coding Test/Programmers
[프로그래머스] 단체사진 찍기 (java)
Heang Lee
2021. 6. 21. 19:15
코딩테스트 연습 - 단체사진 찍기 | 프로그래머스 (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로 구한 후 =,>,<를 만족하지 않는 원소를 지울 수 있도록 적절한 조건문을 람다식으로 작성하였습니다.