문제 : https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV14QpAaAAwCFAYi
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
풀이
// [SWEA] 1215. 회문1 (Java)
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Solution {
static Character[][] arr; // 글자판 배열
static int sum; // 회문의 갯수
static int l; // 회문의 길이
public static void find(int i, int j, String type) {
String tmp = "";
int count = 0;
// 가로 찾기
if(type.equals("x")) {
while(count < l) {
tmp += arr[i][j+count];
count++;
}
}
// 세로 찾기
else {
while(count < l) {
tmp += arr[j+count][i];
count++;
}
}
// 문자열 뒤집기
StringBuffer bf = new StringBuffer(tmp);
String reverse = bf.reverse().toString();
// 회문 여부 검사
if(tmp.equals(reverse)) {
sum++;
}
}
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
for(int t =0; t<10; t++) {
l = Integer.parseInt(br.readLine());
sum = 0;
arr = new Character[8][8];
// 글자판 입력
for(int i=0; i<8; i++) {
String str = br.readLine();
for(int j=0; j<8; j++) {
arr[i][j] = str.charAt(j);
}
}
for(int i=0; i<8; i++) {
for(int j =0; j <= (8-l); j++) {
find(i,j,"x"); // 가로찾기
find(i,j,"y"); // 세로찾기
}
}
System.out.println("#"+ (t+1) + " " + sum);
}
}
}
회문의 길이가 주어지므로
0인덱스 부터 8에서 회문의 길이를 뺀 만큼을 시작인덱스로 정하여
회문 길이만큼 가로, 세로로 합쳐 문자열을 만들어주고
그 문자가 회문인지 확인하면 된다.
1. 글자판 입력, 탐색
글자판을 입력해주고
범위만큼 가로, 세로를 한번에 탐색해준다.
함수를 2개 만들어도 되지만 마지막에 타입을 하나 정해서 x, y 타입 처리를 따로 하도록 하였다.
2. 회문 여부 판별
type이 x면 가로로 문자열을 합쳐주고,
y면 세로로 문자열을 합쳐준다.
그 후 StringBuffer의 reverse로 문자열을 뒤집고
그 문자열이 기존 문자열과 같은지 판별하였다.
하지만 여기선 회문의 길이가 8이라 실행시간이 크진 않았지만
회문의 길이가 엄청 크면
문자열을 다 합쳐서 뒤집는 방식이 아니라
문자열의 첫번째 문자, 마지막 문자 비교하고,
문자열의 두번째 문자, 마지막 전문자 비교하는 것을 반복하면서
회문이 아니면 즉시 리턴하고 다른 것을 찾도록 하는 것이 더 효율적일 것 같다.