Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 클린코드
- DxTrace
- 가장 긴 증가하는 부분 수열2
- 10830번
- 11758번
- java
- 1043번
- BOJ
- 코딩테스트
- Dxerr.h
- 코딩 테스트
- programmers
- 2166번
- 11286번
- Design Pattern
- Adapater Pattern
- 1300번
- Spring
- 17장
- java의 정석
- 9장
- 백준
- 2206번
- SerialDate 리펙터링
- 프로그래머스
- springboot
- 2156번
- Design Patterns
- 자바의 정석
- 냄새와 휴리스틱
Archives
- Today
- Total
Don't give up!
[프로그래머스] 단체사진 찍기 (java) 본문
코딩테스트 연습 - 단체사진 찍기 | 프로그래머스 (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로 구한 후 =,>,<를 만족하지 않는 원소를 지울 수 있도록 적절한 조건문을 람다식으로 작성하였습니다.
'Coding Test > Programmers' 카테고리의 다른 글
[프로그래머스] 보석 쇼핑 (java) (0) | 2021.06.22 |
---|---|
[프로그래머스] 전화번호 목록 (0) | 2021.06.03 |
[프로그래머스] 방문 길이 (java) (0) | 2021.06.02 |