https://www.acmicpc.net/problem/1025

 

1025번: 제곱수 찾기

첫째 줄에 N, M이 주어진다. 둘째 줄부터 N개의 줄에는 표에 적힌 숫자가 1번 행부터 N번 행까지 순서대로 한 줄에 한 행씩 주어진다. 한 행에 적힌 숫자는 1번 열부터 M번 열까지 순서대로 주어지

www.acmicpc.net

코드설명

브루트포스를 활용한 문제입니다.

 

문제에 대한 이해가 쉽지 않으므로, 입력예시를 통해 문제이해 관련하여 설명해보았습니다.

 

입력예시

2 3
123
456

위의 입력예시를 두고 설명해보겠습니다.

(0,0) 부터 시작합니다. 여기서 행의 등차는 -2 부터 2까지입니다. ( -2 부터 2까지인 이유는 3일때 -2를 통해 1로 이동하기 때문 )

열의 등차는 -3 부터 3 까지 입니다.

 

  1. (0,0)에서는 처음에 (-2, -3)으로 시작합니다. 둘다 음수이기에 무시합니다. 여기서 음수인경우는 모두 무시하기 위해 바로 행의 등차가 0, 열의 등차가 0 인경우로 이동하겠습니다.
  2. 행의 등차와 열의 등차가 둘다 (0, 0)인 경우에는 움직이지 않았으므로 continue 처리합니다. ( continue 처리 안할경우 0,0에서 움직이지 않아서 계속해서 무한루프를 돕니다. )
  3. 이제 드디어 행의 등차가 1 이고, 열의 등차가 0 인경우입니다. (0, 0) 은 1 입니다. 해당 값을 now값에 넣어서 now = 1 이 됩니다. 그리고 1 의 제곱근은 1 이기에 result값은 1 로 갱신됩니다.
  4. 이제 (0, 0) -> (1,0) 으로 이동합니다. now = 1 * 10 으로 now = 10 이 되고, (1,0) 의 값인 2 가 now 에 더해져서 now = 12 가 됩니다. now 는 완전 제곱수가 아니기에 해당 사항은 result값이 변경이 되지 않습니다.
  5. 이제 (0,0) -> (1,0 ) -> (2,0 ) 으로 이동해서 같은 로직을 반복합니다.

 

 

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;


public class Main {
	
	public static int N, M;
	public static int[][] map;
	public static String S, T;
	public static int result = -1;
    public static void main(String[] args) throws IOException{
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	
    	StringTokenizer st = new StringTokenizer(br.readLine());
    	N = Integer.parseInt(st.nextToken());
    	M = Integer.parseInt(st.nextToken());
    	
    	map = new int[N][M];
    	for(int i=0;i<N;i++) {
    		String s = br.readLine();
    		for(int j=0;j<M;j++) {
    			map[i][j] = Integer.parseInt(String.valueOf(s.charAt(j)));	
    		}
    	}
    	
    	for(int i=0;i<N;i++) {
    		for(int j=0;j<M;j++) {
    			for(int di =-N; di<N;di++){ //행의 등차값 ( 행의 등차값은 -N ~ +N 까지 ) 
    				for(int dj = -M; dj<M;dj++) { //열의 등차값 ( 열의 등차값은 -M ~ +M 까지 )
    					
    					if(di == 0 && dj == 0) { //둘다 움직이지 않을떄
    						continue;
    					}
    					
    					int nI = i;
    					int nJ = j;
    					int now = 0;
    					while( nI >= 0 && nI < N && nJ >= 0 && nJ < M) {
    						//자리수 10의 자리수 씩 체크하기 위해 로직처리
    						now *= 10;
    						now += map[nI][nJ];
    						
    						//제곱근인지 판별
    						int sqrt_check = (int) Math.sqrt( (double) now);
    						if( sqrt_check * sqrt_check == now) result = Math.max(result, now);
    						
    						nI += di;
    						nJ += dj;
    					}
    					
    				}
    			}
    		}
    	}
    	System.out.println(result);
    	
    	
    }
    
    
}

 

+ Recent posts