코딩테스트/SWEA
[SWEA 1216번] 회문2
seung_ho_choi.s
2025. 5. 3. 22:50
728x90
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV14Rq5aABUCFAYi
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
무작정 풀기
import java.io.*;
import java.util.*;
public class Solution {
static int N;
static String[][] alphabet;
static int result;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
for (int test = 1; test < 11; test++) {
N = Integer.parseInt(br.readLine());
alphabet = new String[100][100];
result = 0;
for (int i = 0; i < 100; i++) {
String input = br.readLine();
for (int j = 0; j < 100; j++) {
alphabet[i][j] = String.valueOf(input.charAt(j));
}
}
solution();
System.out.println("#" + N + " " + result);
}
}
public static void solution() {
// 가로
for (int i = 0; i < 100; i++) {
for (int j = 0; j < 100; j++) {
StringBuilder width = new StringBuilder();
for (int k = j; k < 100; k++) {
width.append(alphabet[i][k]);
String original = width.toString();
String reverse = new StringBuilder(original).reverse().toString();
if (original.equals(reverse)) {
result = Math.max(result, width.length());
}
}
}
}
// 세로
for (int i = 0; i < 100; i++) {
for (int j = 0; j < 100; j++) {
StringBuilder high = new StringBuilder();
for (int k = j; k < 100; k++) {
high.append(alphabet[k][i]);
String original = high.toString();
String reverse = new StringBuilder(original).reverse().toString();
if (original.equals(reverse)) {
result = Math.max(result, high.length());
}
}
}
}
}
}
DP
import java.io.*;
import java.util.*;
public class Solution {
static int N;
static String[][] alphabet;
static int result;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
for (int test = 1; test < 11; test++) {
N = Integer.parseInt(br.readLine());
alphabet = new String[100][100];
result = 0;
for (int i = 0; i < 100; i++) {
String input = br.readLine();
for (int j = 0; j < 100; j++) {
alphabet[i][j] = String.valueOf(input.charAt(j));
}
}
solution();
System.out.println("#" + N + " " + result);
}
}
public static void solution() {
// 가로
for (int row = 0; row < 100; row++) {
boolean[][] dp = new boolean[100][100];
for (int len = 1; len < 101; len++) {
for (int i = 0; i + len - 1 < 100; i++) {
int j = i + len - 1;
if (len == 1) {
dp[i][j] = true;
} else if (len == 2) {
dp[i][j] = alphabet[row][i].equals(alphabet[row][j]);
}else{
dp[i][j] = alphabet[row][i].equals(alphabet[row][j]) && dp[i+1][j-1];
}
if(dp[i][j]){
result=Math.max(result, len);
}
}
}
}
// 세로
for(int col =0; col<100; col++){
boolean[][] dp =new boolean[100][100];
for(int len=1; len<101; len++){
for(int i=0; i+len-1 < 100; i++){
int j = i + len -1;
if(len == 1){
dp[i][j] =true;
}else if(len == 2 ){
dp[i][j] = alphabet[i][col].equals(alphabet[j][col]);
}else{
dp[i][j] = alphabet[i][col].equals(alphabet[j][col]) && dp[i+1][j-1];
}
if(dp[i][j]){
result = Math.max(result, len);
}
}
}
}
}
}
이 문제는 시간 제한이 없어 단순하게 풀어도 되는 쉬운 문제다.
하지만 그렇게만 풀다 보면 실력 향상에 도움이 되지 않을 것 같아, DP(동적 계획법)를 활용해 보았다.
DP의 핵심은 dp[i][j]에 i번째부터 j번째까지의 ture 인지 false 인지를 저장해두는 것이다.
그리고 한 가지 참고할 점은, StringBuilder에서 reverse()를 사용하면 원본 문자열도 바뀐다는 사실을 알게 되었다...ㅎㅎ
728x90