이문제 푸는데 두시간이 걸림...
import java.io.BufferedReader;
import java.io.FileReader;
public class sw1215 {
static int T = 10;
static char [][] arr;
static int N;
static int answer;
public static void main(String [] args) throws Exception{
BufferedReader br = new BufferedReader(new FileReader("src/input (2).txt"));
for(int test = 1; test<=T; test++) {
N = Integer.parseInt(br.readLine()); //글자 길이
arr = new char[8][8];
for(int k = 0; k<arr.length; k++) {
arr[k] = br.readLine().toCharArray();
}
//
answer = 0;
//
for(int i = 0; i<arr.length; i++) {
for(int w = 0; w <8; w++) {
char [] subArray = new char[N];
for(int k = 0; k<N ; k++) {
if(w+k < arr.length && w+N <=arr.length){
subArray[k] = arr[i][w+k];
}
}
ispalindrome(subArray);
}
}
for(int a = 0; a<arr.length; a++) {
for(int b = 0; b <8; b++) {
char [] subArray = new char [N];
for(int c = 0; c<N; c++) {
if(b+c < arr.length && b+N <=arr.length){
subArray[c] = arr[b+c][a];
}
}
ispalindrome(subArray);
}
}
System.out.println("#"+test+" "+answer);
}
br.close();
}
public static void ispalindrome(char [] arr2) {
StringBuilder sb1 = new StringBuilder();
StringBuilder sb2 = new StringBuilder();
for(int i = 0; i<=(N-1)/2; i++) { //0 1 2 3 4 면, 01까지
sb1.append(arr2[i]);
}
for(int j=N-1;j>(N-1)/2;j--) {
sb2.append(arr2[j]);
}
// System.out.println("sb1: "+sb1);
// System.out.println("sb2: "+sb2);
if(sb1.toString().equals(sb2.toString())) {
answer++;
}
}
}
내가 풀다가 포기한 것
답이 60개 막이렇게 나옴 미친것
그런데?
내가누구? 성공함
ㅎㅎ
코드
import java.io.BufferedReader;
import java.io.FileReader;
public class sw1215 {
static int T = 10;
static char [][] arr;
static int N;
static int answer;
public static void main(String [] args) throws Exception{
BufferedReader br = new BufferedReader(new FileReader("src/input (2).txt"));
for(int test = 1; test<=T; test++) {
N = Integer.parseInt(br.readLine()); //글자 길이
arr = new char[8][8];
for(int k = 0; k<arr.length; k++) {
arr[k] = br.readLine().toCharArray();
}
//
answer = 0;
//
for(int i = 0; i<arr.length; i++) {
for(int w = 0; w<=arr.length - N; w++) {
char [] subArray = new char[N];
for(int k = 0; k<N ; k++) {
subArray[k] = arr[i][w+k];
}
ispalindrome(subArray);
}
}
for(int a = 0; a<arr.length; a++) {
for(int b = 0; b<=arr.length - N; b++) {
char [] subArray = new char [N];
for(int c = 0; c<N; c++) {
subArray[c] = arr[b+c][a];
}
ispalindrome(subArray);
}
}
System.out.println("#"+test+" "+answer);
}
br.close();
}
public static void ispalindrome(char [] arr2) {
StringBuilder sb1 = new StringBuilder();
StringBuilder sb2 = new StringBuilder();
// if(N%2 == 0) { // n이 수일경우 n-1/2까지 포함시켜줘야됨.
// for(int i = 0; i<=((N-1)/2)+1; i++) { //0 1 2 3 4 면, 01까지
// sb1.append(arr2[i]);
// }
// for(int j=N-1;j>=((N-1)/2);j--) {
// sb2.append(arr2[j]);
// }
// }
if(N%2 == 0) { //
for(int i = 0; i<N/2; i++) { //0 1 2 3 4 면, 01까지
sb1.append(arr2[i]);
}
for(int j=N-1;j>=N/2;j--) {
sb2.append(arr2[j]);
}
}
else {
for(int i = 0; i<(N-1)/2; i++) { //0 1 2 3 4 면, 01까지
sb1.append(arr2[i]);
}
for(int j=N-1;j>(N-1)/2;j--) {
sb2.append(arr2[j]);
}
}
if(sb1.toString().equals(sb2.toString())) {
answer++;
}
}
풀이
1. N개씩 자른 sub 배열을 (행/열)나눠서 회문인지 아닌지 검사해주는 반복문에 집어넣는다.
- 여기서 배열을 자를 때 고생을 좀 했는데, 예를 들어 길이가 8인데 N= 4이고 시작 인덱스가 5라면 5,6,7 까지 밖에 못들어가니까
시작 (인덱스 + N = 배열의 길이) 공식을 지켜줘야 했다.
- 따라서 행,열을 나눠서 배열을 자를 때 어차피 나눠서 들어가게 되면 arr.length - N 까지는 탐색이 다 되므로 배열 인덱스를 조정해줬다. (이거 생각해 내기가 힘들었음 ...)
2. 회문인지 아닌지 검사한다.
여기서는 그냥 내가 생각하는 대로 했는데, StringBuilder를 이용해서 배열의 첫번째 인덱스~(n-1)/2까지 넣고, 배열의 마지막 인덱스부터 역으로 가서 (n-1)/2 까지 append 한 값을 같은지 비교했다.
- 하지만 여기서도 난관인게 짝수와 홀수가 달랐는데, N이 홀수일 때는 시작 인덱스부터 ((N-1)/2) -1 까지만 넣어줘야 하고, 마지막 인덱스부터도 마찬가지로 적용한다..
- 짝수였을 때는 N-2전까지, 마지막부터 N-2까지만 표현해주면 된다.
3. StringBuilder를 toString()으로 바꾸고 답을 낸다
끝^_^
Swea에 낸 답
import java.util.Scanner;
public class Solution {
static int T = 10;
static char [][] arr;
static int N;
static int answer;
public static void main(String [] args) throws Exception{
Scanner sc = new Scanner(System.in);
//BufferedReader br = new BufferedReader(new FileReader("src/input (2).txt"));
for(int test = 1; test<=T; test++) {
N = sc.nextInt(); //글자 길이
sc.nextLine(); // 개행 문자 읽기
arr = new char[8][8];
for(int k = 0; k<arr.length; k++) {
arr[k] = sc.nextLine().toCharArray();
}
answer = 0;
for(int i = 0; i<arr.length; i++) {
for(int w = 0; w<=arr.length - N; w++) {
char [] subArray = new char[N];
for(int k = 0; k<N ; k++) {
subArray[k] = arr[i][w+k];
}
ispalindrome(subArray);
}
}
for(int a = 0; a<arr.length; a++) {
for(int b = 0; b<=arr.length - N; b++) {
char [] subArray = new char [N];
for(int c = 0; c<N; c++) {
subArray[c] = arr[b+c][a];
}
ispalindrome(subArray);
}
}
System.out.println("#"+test+" "+answer);
}
}
public static void ispalindrome(char [] arr2) {
StringBuilder sb1 = new StringBuilder();
StringBuilder sb2 = new StringBuilder();
if(N%2 == 0) { // n이 수일경우 n-1/2까지 포함시켜줘야됨.
for(int i = 0; i<=((N-1)/2)+1; i++) { //0 1 2 3 4 면, 01까지
sb1.append(arr2[i]);
}
for(int j=N-1;j>=(N-1)/2;j--) {
sb2.append(arr2[j]);
}
}
else {
for(int i = 0; i<(N-1)/2; i++) { //0 1 2 3 4 면, 01까지
sb1.append(arr2[i]);
}
for(int j=N-1;j>(N-1)/2;j--) {
sb2.append(arr2[j]);
}
}
if(sb1.toString().equals(sb2.toString())) {
answer++;
}
}
}
sc.nextInt() 다음에 개행문자가 읽히므로 sc.nextLine()으로 개행문자를 버퍼에서 지워줘야 한다.
'코테 > SWEA' 카테고리의 다른 글
[D2 SWexpert] 백만장자 되기 (0) | 2024.05.12 |
---|
안녕하세오 저는 똑똑해지고 싶은 버그 수집가에오
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!