사실 이 문제를 풀다가 고민할만큼 한 것 같은데 블로그 참고할까?..라는 생각이 들었는데 마지막으로 다시 한 번 생각했다!
반복문 돌 틀
회문 판단과 문장 선택
A,B,C만 나오니까각각의 위치를 저장하고 위치의 차이가 길이가 된다면 어떨까? => 이건 같은 게 여러 개 나오니까 그들의 위치를 다 저장하고 하나씩 빼면서 구하기엔 무리가 존재..더구나!그 안에께 거꾸로 해도 일치하는 보장이 전혀 없는 잘못된 생각!
DFS를 이용해서 만들 수 있는 문장을 쭉 만들까?..애초에 문장에 순서가 정해져있고 이 문제에서는 적절치 않아 보였다.
회문을 판단하기 어렵다면 회문이 뭘까?
회문의 정의는 똑바로 읽어도 거꾸로 읽어도 똑같은 문장이고.
우리는 이걸 구하고 있다.
우리가 구하려는 회문의 길이가 정해져있기 때문에 정해준 길이만큼만 보면 된다! 전체를 보려고 하지말자!
그래서 길이만큼의 문장을 뽑으면 그 문장을 회문 검사 함수에 돌려버리고 리턴값에 따라 정답++
import java.util.*;
import java.io.*;
public class Main
{
public static void main(String args[]) throws Exception
{
Scanner sc = new Scanner(System.in);
//회문의 특징 a에서 시작하면 a로 끝난다!
for(int test_case = 1; test_case <= 10; test_case++)
{
int findLen = sc.nextInt();
int answer = 0;
//8*8판 입력
char[][] board = new char[8][8];
for(int i = 0 ; i < 8; i++) {
String temp = sc.next();
for(int j = 0 ; j < 8; j++){
board[i][j] = temp.charAt(j);
}
}
//행(세로)에서 회문
for(int i = 0 ; i < 8; i++){
for(int j = 0 ; j <= 8-findLen; j++){
String temp = "";
for(int k=j; k < j+findLen; k++){
temp += board[i][k];
}
if(isSame(temp) == 1)
answer++;
}
}
//열(가로)에서 회문
for(int i = 0 ; i < 8; i++){
for(int j = 0 ; j <= 8-findLen; j++){
String temp = "";
for(int k=j; k < j+findLen; k++){
temp += board[k][i];
}
if(isSame(temp) == 1)
answer++;
}
}
System.out.println("#" + test_case + " " + answer);
}
}
private static int isSame(String temp) {
String comp = "";
for(int i = temp.length()-1; i >= 0 ; i--){
comp += temp.charAt(i);
}
if(comp.equals(temp))
return 1;
else
return 0;
}
}