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 까지 입니다.
- (0,0)에서는 처음에 (-2, -3)으로 시작합니다. 둘다 음수이기에 무시합니다. 여기서 음수인경우는 모두 무시하기 위해 바로 행의 등차가 0, 열의 등차가 0 인경우로 이동하겠습니다.
- 행의 등차와 열의 등차가 둘다 (0, 0)인 경우에는 움직이지 않았으므로 continue 처리합니다. ( continue 처리 안할경우 0,0에서 움직이지 않아서 계속해서 무한루프를 돕니다. )
- 이제 드디어 행의 등차가 1 이고, 열의 등차가 0 인경우입니다. (0, 0) 은 1 입니다. 해당 값을 now값에 넣어서 now = 1 이 됩니다. 그리고 1 의 제곱근은 1 이기에 result값은 1 로 갱신됩니다.
- 이제 (0, 0) -> (1,0) 으로 이동합니다. now = 1 * 10 으로 now = 10 이 되고, (1,0) 의 값인 2 가 now 에 더해져서 now = 12 가 됩니다. now 는 완전 제곱수가 아니기에 해당 사항은 result값이 변경이 되지 않습니다.
- 이제 (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); } }
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 16637 괄호 추가하기 - 완전탐색(BruteForce) + DFS(깊이우선탐색) + 연산자 JAVA (0) | 2023.07.18 |
---|---|
[백준] 21278 호석이 두 마리 치킨 - DFS(조합) + BFS JAVA (0) | 2023.07.17 |
[백준] 12919 A와 B 2 - 완전탐색 (DFS) + 문자열 JAVA (0) | 2023.07.16 |
[백준] 15661 링크와 스타트 - 완전탐색 (DFS) JAVA (0) | 2023.07.16 |
[백준] 2615 오목 - 완전탐색 (DFS) JAVA (0) | 2023.07.16 |