https://school.programmers.co.kr/learn/courses/30/lessons/1835

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

이번 문제는 다양한 함수를 겪어서 정리할게 많습니다.

 

기억해야할점들

-순열구하는공식은 이전에 배운적이 있어서 바로 적용했습니다.

 

-String.indexOf를 사용하여 문자에서 해당 위치를 찾은뒤 기준 단어와 비교할 단어의 거리를 계산하면 몇배는 빠르게 코딩할 수 있습니다. 이전에는 for문으로 직접 다 셌는데 무조건 이렇게 해야 빠르게합니다.

그리고 여기서 distance + 1을 하는 이유는 칸이 1개 차이라면 A _ F 입니다. 즉 Math.abs(standard-compare)을 하면 한칸차이라도 index 상으로는 2칸차이이니 distnace+1을 하는 것입니다. 

 

-Arrays.toString(String[]) 배열을 사용할때

{"A", "B", "C"} 가 있다면 return 값은 [A , B , C ] 이렇게 리턴됩니다.. 이걸 그냥 출력형식이라고 생각한것이 잘못입니다.

String output_str = Arrays.toString(output).replaceAll(",| |\\]|\\[",""); 이렇게 해야 ABC 가 나오는데 이렇게하면 40000건에 대하여 모두 replaceAll을 시전하므로 시간초과가 나서 String[] 배열을 함수 인자에 넣고 돌리거나 마지막에 배열값만큼 새로 추가하는 방법밖에 없습니다.

와.. 이걸 몰라서 몇시간을;;

 

 

 

import java.io.*;
import java.util.*;
import java.util.Map.*;
class Solution {
String[] teammember = {"A", "C", "F", "J", "M", "N", "R", "T"};
String[] output = new String[8];
boolean[] visited = new boolean[8];
int answer = 0;
String[] datatemp;
public int solution(int n, String[] data) {
datatemp = data;
permutation(8, 0);
return answer;
}
public boolean solve(String permutation_str){
for(int i=0;i<datatemp.length;i++){
//data값 정리
String operand = String.valueOf(datatemp[i].charAt(3));
int distance = Integer.parseInt(String.valueOf(datatemp[i].charAt(4)));
//실제연산시작
int standardposition = permutation_str.indexOf(datatemp[i].charAt(0));
int compareposition = permutation_str.indexOf(datatemp[i].charAt(2));
if(operand.equals("=")){
if( (Math.abs(standardposition - compareposition) == distance+1) == false ) return false;
}else if(operand.equals(">")){
if( (Math.abs(standardposition - compareposition) > distance+1) == false) return false;
}else if(operand.equals("<")){
if( (Math.abs(standardposition - compareposition) < distance + 1) == false) return false;
}
}
return true;
}
public void permutation(int r, int current){
if(r == current){
//여기서 output을 string으로 변환한뒤?? data의 조건들을 만족시킨다면 continue, 하나라도 만족안한다면 바로 boolean return false;
// String output_str = Arrays.toString(output).replaceAll(",| |\\]|\\[","");
String str = "";
for(int i=0;i<8;i++)
str += output[i];
if(solve(str) == true){
answer+=1;
}
return ;
}
for(int i=0;i<r;i++){
if(visited[i] == false){
visited[i] = true;
output[current] = teammember[i];
permutation(r, current+1);
visited[i] = false;
}
}
}
// public void permutation(int r, int current, String str){
// if(r == current){
// //여기서 output을 string으로 변환한뒤?? data의 조건들을 만족시킨다면 continue, 하나라도 만족안한다면 바로 boolean return false;
// // String output_str = Arrays.toString(output).replaceAll(",| |\\]|\\[","");
// if(solve(str) == true){
// answer+=1;
// }
// return ;
// }
// for(int i=0;i<r;i++){
// if(visited[i] == false){
// visited[i] = true;
// // output[current] = teammember[i];
// permutation(r, current+1, str + teammember[i]);
// visited[i] = false;
// }
// }
// }
}

+ Recent posts