본문 바로가기

Development/CodingTest

[SWEA] [S/W 문제해결 기본] 3일차 - 회문1 Java 풀이

https://swexpertacademy.com/main/talk/solvingClub/problemView.do?contestProbId=AV14QpAaAAwCFAYi&solveclubId=AV6kld8aisgDFASb&problemBoxTitle=%5BD2%7ED3+%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4%5D+%EA%B8%B0%EC%B4%88+%EB%8B%A4%EC%A7%80%EA%B8%B0+Part4&problemBoxCnt=14&probBoxId=AV-4MojKLNADFATz

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

문제 설명

8x8 문자가 저장되어 있는 격자판에 가로, 세로로 제시되는 길이만큼 문자열을 만들었을때 팰린드롬이 몇 개인지를 찾는 문제이다.

 

문제 접근

처음엔 회문의 길이만큼 문자열을 하나씩 만들어 나가야겠다고 생각했다.

그러다보니 for 문의 인덱스를 어떻게 잡아야할지 도저히 이해가 안됐다.

for(int i = 0; i < 8; i++) {
	for (int j = i; j + targetLength < 8; j++){
    	...
    }
}

 

처음엔 대충 저런 for 문을 작성했었는데,,, 고치고 고치다보니 너무 어렵게 생각하게 되었다.

 

다른 풀이법을 찾다가 Queue처럼 작성한 풀이법을 보았다.

그리고 다시 코드를 설계해보았다.

그러다 보니 복잡한 인덱스 계산이 필요없었다.

그냥 찾으려는 길이만큼 첫 index부터 StringBuilder에 넣고, 다음 반복때 맨 앞 문자를 떼고 다음 문자를 붙이는 Queue로 구현을 하면된다. 

코드

import java.io.*;
import java.util.*;

class Solution {
    public static void main(String args[]) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder answerBuilder = new StringBuilder();
        for (int test = 1; test <= 10; test++) {
            int targetLength = Integer.parseInt(br.readLine());
            int answer = 0;
            String[][] array = new String[8][8];
            for (int i = 0; i < 8; i++) {
                array[i] = br.readLine().split("");
            }
            
            for (int i = 0; i < 8; i++) {
                StringBuilder rowStringQueue = new StringBuilder();
                StringBuilder colStringQueue = new StringBuilder();
                for (int j = 0; j < 8; j++) {

                    if (rowStringQueue.length() < targetLength) {
                        rowStringQueue.append(array[i][j]);
                    } else {
                        if (Pallen(rowStringQueue.toString())) {
                            answer++;
                        }
                        rowStringQueue.deleteCharAt(0);
                        rowStringQueue.append(array[i][j]);
                    }

                    if (colStringQueue.length() < targetLength) {
                        colStringQueue.append(array[j][i]);
                    } else {
                        if (Pallen(colStringQueue.toString())) {
                            answer++;
                        }
                        colStringQueue.deleteCharAt(0);
                        colStringQueue.append(array[j][i]);
                    }

                    if (j == 7) {
                        if (Pallen(rowStringQueue.toString())) {
                            answer++;
                        }
                        if (Pallen(colStringQueue.toString())) {
                            answer++;
                        }
                    }
                }
            }
            answerBuilder.append("#").append(test).append(" ").append(answer).append("\n");
        }
        System.out.println(answerBuilder);
    }

    public static boolean Pallen(String str) {
        String reversed = new StringBuilder(str).reverse().toString();
        return str.equals(reversed);
    }
}

느낀 점

나는 솔직히 복잡한 걸 잘 못 찾는다...

직관적이고, 단순하고, 눈에 보이는 코드가 좋다. 그렇게 풀 수 있는 문제도 좋다.

그걸 고집하다보니 시간 초과가 나기도 하고, 히든 케이스에 틀리기도 한다.

 

그래도 어쩌겠습니까.. 많이 풀어보고 연습해야지...