코딩/알고리즘
[알고리즘] 프로그래머스 단체사진 찍기 Java(자바)
유어노우
2022. 1. 7. 23:54
- 문제
https://programmers.co.kr/learn/courses/30/lessons/1835
코딩테스트 연습 - 단체사진 찍기
단체사진 찍기 가을을 맞아 카카오프렌즈는 단체로 소풍을 떠났다. 즐거운 시간을 보내고 마지막에 단체사진을 찍기 위해 카메라 앞에 일렬로 나란히 섰다. 그런데 각자가 원하는 배치가 모두
programmers.co.kr
- 코드 설명
Rule class를 작성하여 data에 있는 코드를 변환해 줍니다.
이 코드에서 핵심은 규칙을 통해 A와 B사이의 인덱스 차이를 min , max로 설정해 주어야 합니다.
'=' 일경우 min,max는 같아야 합니다.
'<' 일경우 숫자가 2인경우에 둘사이에 1명이하만 허용한다는 뜻하고 인덱스 차이를 고려하여 min = 1, max = num
'>' 일경우 숫자가 2인경우 둘사이에 최소 3명 최대 6명까지 허용합니다(ex A의 index1일때 B의 최소 index가 5이상이어야함 따라서 둘의 차이는 4) min = num + 2 ,max =7가 되어야 한다.
order는 카카오 캐릭터들의 배열이 저장되어있는 문자열이고 다배치가 되어야 규칙검사를 시작한다.
이것을 재귀로 풀이했으며 다른분들의 코드를 보니 정말 다양한 방법이 많았습니다.
class Solution {
static String[] persons;
static int answer;
static Rule[] rules;
public int solution(int n, String[] data) {
int len = data.length;
answer = 0;
persons = new String("A C F J M N R T").split(" ");
rules = new Rule[len];
boolean[] visited = new boolean[persons.length];
for(int i=0; i<len; i++){
rules[i] = new Rule(data[i]);
}
sol(visited, new String(),0);
return answer;
}
static void sol(boolean[] visited, String order, int level){
if(level == 8){
for(Rule r : rules){
if(r.check(order) == false) return;
}
answer++;
return;
}
for(int i=0; i<8; i++){
if(visited[i] == false){
visited[i] = true;
sol(visited, order.concat(persons[i]), level + 1);
visited[i] = false;
}
}
}
}
class Rule{
String A;
String B;
int min;
int max;
public Rule(String rule){
char op = rule.charAt(3);
int num = rule.charAt(4) - '0';
A = Character.toString(rule.charAt(0));
B = Character.toString(rule.charAt(2));
if(op == '='){
min = num+1;
max = num+1;
}
else if(op =='<'){
min = 1;
max = num;
}
else if(op == '>'){
min = num+2;
max = 7;
}
}
public boolean check(String order){
int idxA = order.indexOf(this.A);
int idxB = order.indexOf(this.B);
int result = Math.abs(idxA - idxB);
if( min<= result && result <=max){
return true;
}
else
return false;
}
}