코딩테스트/SWEA_Java
Q. 1215. 회문(D3)
Ski_
2023. 5. 11. 16:25
0. 문제
D3 난이도의 문제이고, 격자형 그래프를 활용한 구현 문제라고 생각된다.
N이 주어지고 문자가 적혀있는 격자형 그래프가 주어진다.
격자형 그래프의 가로 / 세로 N개의 문자열을 뽑았을 때
똑바로/거꾸로 읽어도 똑같은 단어의 경우의 수를 구하는 문제이다.
1. 풀이
1) 격자형 그래프를 두 개 저장하는데, 하나는 그대로 나머지는 90도 돌린 방향으로 저장한다.
(가로 / 세로 모두를 고려 해야 하므로)
2) 나올 수 있는 모든 문자열에 대해 회문 문자인지 판별한다.
(만약 N이 홀수인 경우 ex.4 모든 문자를 비교해야 하지만, 5인 경우 1 2번째와 4 5번째 문자만 비교하면 된다.)
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Solution {
static BufferedReader br;
static StringTokenizer st;
static StringBuilder sb = new StringBuilder();
static char[][] inputArrHorizon;
static char[][] inputArrVertical;
static int N;
public static void input() throws IOException {
N = Integer.parseInt(br.readLine());
inputArrHorizon = new char[8][];
inputArrVertical = new char[8][8];
for (int i = 0; i < 8; i++) {
inputArrHorizon[i] = br.readLine().toCharArray();
}
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
inputArrVertical[i][j] = inputArrHorizon[j][i];
}
}
}
public static void pro(int tc) {
int res = 0, cnt = 0;;
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8 - N + 1; j++) {
if (compare(inputArrHorizon[i], j)) res++;
if (compare(inputArrVertical[i], j)) res++;
}
}
sb.append(String.format("#%d %d\n", tc, res));
}
public static boolean compare(char[] Arr, int startIdx) {
for (int i = 0; i < N/2 ; i++) {
if (Arr[startIdx + i] != Arr[startIdx + N - i - 1]) {
return false;
}
}
return true;
}
public static void main(String[] args) throws Exception {
// br = new BufferedReader(new InputStreamReader(new FileInputStream("res/input.txt")));
br = new BufferedReader(new InputStreamReader(System.in));
int T = 10;
for (int tc = 1; tc <= T; tc++) {
input();
pro(tc);
}
System.out.println(sb);
}
}
2. 시간복잡도 계산
1) 문자열 저장 - O(8 x 8)
2) 풀이 2번 - O(2 x 8 x (8-N))
따라서 시간복잡도는 상수 시간 범위 내에서 충분히 해결할 수 있다.
반응형