Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 18233 러버덕
- django windows 배포 에러
- windows apache wsgi 에러
- 1188 java
- The requested operation has failed!
- django settings.py
- 18233 java
- 원격 연결 포트 포워딩
- 2643 java
- 2961 java
- 14711 타일 뒤집기
- windows 원격 연결 설정
- 1188 음식 평론가
- 2661 좋은 수열
- apache pythonpath
- django 웹 페이지
- 2961 도영이가 만든 맛있는 음식
- Problems occurred while performing provisioning operation
- django
- 2661 java
- django The requested operation has failed!
- APPEND_SLASH = FALSE
- java di
- django httpd error
- django apache deploy error
- 2643 색종이 올려 놓기
- 공유기 원격 설정
- 18233 비트마스킹
- 14711 java
- django 프로젝트 시작
Archives
라이브러리는 도서관 아닌가요
백준(BOJ) 1025 제곱수 찾기 java 본문
https://www.acmicpc.net/problem/1025
행과 열이 등차수열을 이루어야 한다.
예를 들면,
2 3
123
456
이렇게 수가 있을 때,
1번
(1,1) (1,2) (1,3)는 등차수열을 이룬다.
해당 순서로 수를 뽑아내면 123이 된다.
하지만 123은 제곱수가 될 수 없다.
탈락
2번
(1,3) (2,3)은 등차수열을 이룬다.
해당 순서로 수를 뽑아내면 36이 된다.
합격
3번
(1,1) (1,2) (1,1)로 수를 뽑으면 121로 11의 제곱수이지만,
등차수열이 아니다.
탈락
따라서 위에서 해당 조건을 모두 만족하는 최대의 수를 뽑아내면 결국에는 64가 된다.
(2,3) (2,1)
문제 설명이 좀 이해하기 어려운데,
수정 이후인 지금도 껄끄러운 면이 있다.
결국 다중 반복문을 사용하게 하는 문제 자체가 좀 난해한 느낌도 있다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
// 입력 배열
static String[] arr;
static int[][] map;
static int N, M;
static int ans = -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());
arr = new String[N+1];
map = new int[N][M];
for(int i=0; i<N; ++i){
arr[i] = br.readLine();
for(int j=0; j<M; ++j){
map[i][j] = arr[i].charAt(j) - '0';
}
}
// 다중 반복문은 연산 과정이 좀 헷갈리니 나눔
for(int i=0; i<N; ++i){ // 행 시작 부분 제한
for(int j=0; j<M; ++j){ // 열 시작 부분 제한
// 제한된 범위인 i x j를 파라미터로 메서드 호출
slv(j, i);
}
}
System.out.println(ans);
}
public static void slv(int c, int r){
for(int i=-N; i<N; ++i){ // 행 공차
for(int j=-M; j<M; ++j){ // 열 공차
// 연두는 서로 다른 1개 이상의 칸을 선택 --> (1,1), (1,1)과 같은 경우는 무시
if(i == 0 && j == 0) continue;
int x = c; // 제한된 열 시작 부분
int y = r; // 제한된 행 시작 부분
// 만들어질 제곱수
int sqr = 0;
// 범위 체크
while (0<=x && x<M && 0<=y && y<N){
// 제곱수 생성
sqr *= 10;
sqr += map[y][x];
// 제곱근 구하기
int root = (int)Math.sqrt(sqr);
// 제곱수 판별
if( Math.pow(root, 2) == sqr )
ans = Math.max(ans, sqr);
x += j;
y += i;
}
}
}
}
}
시작하는 행, 열 부분을 정한 후 (main의 첫 2중 for문)
증감하는 공차에 따라 (slv 메서드 내의 2중 for문)
제곱수를 생성하고, (공차를 이용해 while문 내에서 범위의(음 또는 양) 끝까지 이동하며 제곱수의 자릿수를 하나씩 추가)
제곱수를 판별한 후 최댓값인지 확인한다.
'알고리즘 문제' 카테고리의 다른 글
백준 (BOJ) 15810 풍선 공장 java (0) | 2022.04.05 |
---|---|
백준 (BOJ) 10815 숫자 카드 java (0) | 2022.03.25 |
백준(BOJ) 2133 타일 채우기 java (0) | 2022.03.21 |
백준(BOJ) 1991 트리 순회 java (0) | 2022.03.15 |
백준 (BOJ) 16236 아기 상어 java (0) | 2021.12.12 |
Comments