
⚠️ 주의!
SWEA에서 낸 코딩 문제에 대한 해답이 들어있습니다.
열람 시 주의해주세요.
SWEA에서 낸 코딩 문제에 대한 해답이 들어있습니다.
열람 시 주의해주세요.
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
8*8이므로 2중 배열을 사용하는 것이 편하다. 그리고 각 열과 행마다 회문을 확인하면 된다. 찾아야하는 회문 길이가 따로 주어짐에 유의하자. 그리고 회문이므로 절반만 체크해도 된다. 여기서 나는 같을 때마다 count하여 그게 N / 2가 되는지 확인했다. 다만 맨 아래에 있는 쪽이 더 효율적이므로 아래를 참고할 것.
정답
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Solution {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int T = 10;
for (int test_case = 1; test_case <= T; test_case++) {
int N = Integer.parseInt(br.readLine()); // 찾아야하는 회문의 길이
char[][] arr = new char[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);
}
} //문자 넣기 종료
int totalCount = 0;
for (int i = 0; i < 8; i++) { //가로 열을 추가한다
for (int j = 0; j <= 8 - N; j++) {
int count = 0;
for (int k = 0; k < N / 2; k++) {
if(arr[i][j + k] == arr[i][j + N - 1 - k]){
count++;
}
}
if(count == N /2) { totalCount++; }
}
}
for (int i = 0; i < 8; i++) { //세로 열을 추가한다
for (int j = 0; j <= 8 - N; j++) {
int count = 0;
for (int k = 0; k < N / 2; k++) {
if(arr[j + k][i] == arr[j + N - 1 - k][i]){
count++;
}
}
if(count == N /2) { totalCount++; }
}
}
sb.append("#").append(test_case).append(" ").append(totalCount).append("\n");
} // 테스트케이스
System.out.print(sb.toString());
}
}
내가 제출한 답은 이건데, 더 경량화하는 방법이 있다. 전체의 가로세로 길이가 동일하므로 가로 및 세로 순회는 동일하게 하고, boolean으로 break 함으로써 조기탈출을 하는 것. 그리고 charAt으로 넣기보단 toCharArray를 처리하는 쪽이 조금 더 빠르다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Solution {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int T = 10;
for (int test_case = 1; test_case <= T; test_case++) {
int N = Integer.parseInt(br.readLine()); // 찾아야하는 회문의 길이
char[][] arr = new char[8][8];
for (int i = 0; i < 8; i++) {
String str = br.readLine();
for (int j = 0; j < 8; j++) {
arr[i] = str.toCharArray();
}
} //문자 넣기 종료
int totalCount = 0;
for (int i = 0; i < 8; i++) { //가로 및 세로가 동일하므로 한번에 처리 가능
for (int j = 0; j <= 8 - N; j++) {
boolean rowOk = true;
boolean colOk = true;
for (int k = 0; k < N / 2; k++) {
if (arr[i][j + k] != arr[i][j + N - 1 - k]) rowOk = false;
if (arr[j + k][i] != arr[j + N - 1 - k][i]) colOk = false;
if (!rowOk && !colOk) break;
}
if (rowOk) totalCount++;
if (colOk) totalCount++;
}
}
sb.append("#").append(test_case).append(" ").append(totalCount).append("\n");
} // 테스트케이스
System.out.print(sb.toString());
}
}
'코테런 > SWEA(알고리즘 수업)' 카테고리의 다른 글
| [코딩 테스트 RUN] SWEA 수업 : 19003. 팰린드롬 문제 (0) | 2026.03.10 |
|---|---|
| [코딩 테스트 RUN] SWEA 수업 : 1216. 회문2 (0) | 2026.03.10 |
| [코딩 테스트 RUN] SWEA 수업 : 1213. String (0) | 2026.03.10 |
| [코딩 테스트 RUN] SWEA 수업 : 1926.간단한 369게임 (0) | 2026.03.10 |
| [코딩 테스트 RUN] SWEA 수업 : 25052. 등산로 (0) | 2026.03.09 |