문제의 저작권은 SW Expert Academy에 있습니다. (출처)
1. 문제
1-1. 문제 설명
1-2. 문제 해석
2. 코드
3. 실행시간
1. 문제
1-1. 문제 설명
1-2. 문제 해석
가로 방향으로 이중 포문 한 번, 세로 방향으로 이중 포문 한 번 사용해서 회문을 찾아야 할 것 같지만
이 문제는 1209번 - Sum 문제처럼 이중 포문 하나로 가로/세로 방향을 탐색할 수 있다.
이 점이 시간 단축을 하는데에 가장 중요한 요소가 아니었나 싶다.
그리고 회문 검사를 할 때 앞 글자와 뒤 글자를 하나씩 비교하는 부분이 은근히 헷갈리기 때문에 유의해야 한다.
회문의 첫 번째 글자 좌표, 회문의 길이, 포문 이렇게 3가지만 있으면 회문 검사를 할 수 있다.
2. 코드
public class Day3_1215_회문1 {
static final int N = 8;
static char[][] arr = new char[N][N];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
for (int tc = 1; tc <= 10; tc++) {
int len = Integer.valueOf(br.readLine());
int cnt = 0;
for (int i = 0; i < N; i++) { // 입력
String temp = br.readLine();
for (int j = 0; j < N; j++) {
arr[i][j] = temp.charAt(j);
}
}
for (int i = 0; i < N; i++) { // 회문 검사
for (int j = 0; j <= N - len; j++) {
if(isColPalindrome(i, j, len)) cnt++;
if(isRowPalindrome(j, i, len)) cnt++;
}
}
sb.append("#").append(tc).append(" ").append(cnt).append("\n");
}
System.out.println(sb.toString());
}
public static boolean isColPalindrome(int y, int x, int len) {
for (int k = 0; k < len / 2; k++) {
if(arr[y][x + k] != arr[y][x + len - 1 - k]) return false;
}
return true;
}
public static boolean isRowPalindrome(int y, int x, int len) {
for (int k = 0; k < len / 2; k++) {
if(arr[y + k][x] != arr[y + len - 1 - k][x]) return false;
}
return true;
}
}
3. 실행시간
💡 느낀 점 (?)
- String을 주며 회문인지를 검사하라고 하면 reverse 해서 똑같은지 검사하면 아주 쉽게 회문 검사가 가능하다.
- 예전에 회문에 관련된 영상을 봤던 게 생각났다. 꽤 흥미로우니 추천!
반응형
'문제 풀이 > SWEA' 카테고리의 다른 글
1218번 - 괄호 짝짓기 (0) | 2021.08.05 |
---|---|
1216번 - 회문2 (0) | 2021.08.04 |
1213번 - String (0) | 2021.08.03 |
1210번 - Ladder1 (0) | 2021.08.03 |
1220번 - Magnetic (0) | 2021.08.02 |
댓글