알고리즘/SWEA

SWEA 1215번 회문1 Java

개발자 정지은 2022. 9. 21. 22:06

주어진 2차원 배열을 돌면서 회문이 몇개 있는지 구하는 문제

===>  구해야 하는 회문의 길이를 주고 가로, 세로 총 몇개의 회문이 있는지 구해야 함

회문 문제에서 핵심은 전체 배열을 탐색할 필요 없이

행 또는 열 기준으로 ( 배열의 길이 - 구해야 할 회문의 길이 + 1 ) 만큼 탐색해주기

예를 들어 4글자 회문을 구하면 1번째 - 4번째, 2번째 - 3번째 가 같은지만 보면 되기 때문에

다시 for문을 돌려서 회문의 길이/2 만큼 비교해주자

<코드>


import java.util.Scanner;

public class Solution {

	/*
	 * 회문 문제 공통 꼭 외우자 배열 탐색은 행 or 열 기준 -> 배열 길이 - 회문 길이 + 1 까지만 보면 됨 회문 문자열인지 아닌지
	 * 판단하려면 그 문자열을 반 접어서 비교한다고 생각 회문길이/2 횟수만큼 비교
	 */

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		
		for(int tc = 1; tc <= 10; tc++) {
			int len = sc.nextInt(); //회문의 길이
			
			char [][] map = new char [8][8];
			
			//배열 채워주기
			for(int i=0; i<map.length; i++) {
				String str = sc.next();
				for(int j=0; j<map[i].length; j++) {
					map[i][j] = str.charAt(j);
				}
			}
			//배열 탐색 후 flag의 true 여부에 따라서 cnt 증가 시켜줄 것
			boolean flag;
			int cnt = 0;
			
			//행 기준 탐색
			for(int i=0; i<map.length; i++) {
				for(int j=0; j<map.length-len+1; j++) {
					flag = true;
					for(int k=0; k<len/2; k++) 
						if(map[i][j+k]!=map[i][j-k+len-1])
							flag = false;
						
						if(flag) cnt ++;
				}
			}
			
//	          //가로 
//	          for(int i = 0; i < map.length; i++) {
//	              for(int j = 0; j < map.length - len + 1; j++) {
//	                  flag = true;
//	                  for(int h = 0; h < len / 2; h++)
//	                      if(map[i][j + h] != map[i][j - h + len - 1])
//	                          flag = false;
//	                  if(flag) cnt++;
//	              }
//	          }
	          
			
		

			
			//열 기준 탐색
			for(int i=0; i<map.length-len+1; i++) {
				for(int j=0; j<map.length; j++) {
					flag = true;
					for(int k=0; k<len/2; k++) 
						if(map[i+k][j]!=map[i-k+len-1][j])
							flag = false;
						
						if(flag) cnt ++;
					
				}
			}
			

//	          //세로 
//	          for(int i = 0; i < map.length - len + 1; i++) {
//	              for(int j = 0; j < map.length; j++) {
//	                  flag = true;
//	                  for(int h = 0; h < len / 2; h++)
//	                      if(map[i + h][j] != map[i - h + len - 1][j])
//	                          flag = false;
//	                  if(flag) cnt++;
//	              }
//	          }
			
			
			System.out.println("#"+tc+" "+cnt);
			
			
			
		}
		

	}

}

가로, 세로 기준으로 for문을 돌릴 때 괄호를 잘못 묶어줘서 계속 fail이 떴던 문제

회문의 개념과 구하는 방식만 알면 어렵지 않은 문제였음

괄호로 묶는 것 주의하기!!!!