일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Java
- https
- 맥북
- 리눅스
- AWS
- springboot
- Gradle
- 로드밸런스
- dbeaver
- spring
- 우리FISA #
- 우리에프아이에스
- M2
- jdk
- mysql
- route 53
- 맥OS
- 우리FIS아카데미 #
- 우리FIS아카데미
- 우리에프아이에스 #
- 클라우드 서비스 개발
- 우리FISA
- sts
- 글로벌소프트웨어캠퍼스
- HTTP
- 맥
- 클라우드 서비스 개발 #
- 도메인
- K-디지털트레이닝
- Today
- Total
<<개발일지>>
[백준/1051/실버3] 숫자 정사각형 본문
https://www.acmicpc.net/problem/1051
1051번: 숫자 정사각형
N×M크기의 직사각형이 있다. 각 칸에는 한 자리 숫자가 적혀 있다. 이 직사각형에서 꼭짓점에 쓰여 있는 수가 모두 같은 가장 큰 정사각형을 찾는 프로그램을 작성하시오. 이때, 정사각형은 행
www.acmicpc.net
레벨 실버3
<<풀이>>
소감 : 문제 자체의 구현은 어렵지가 않았다. 다만 사용한 적이 드문 bufferreader의 안 익숙함이 문제였다.
시간복잡도 : O(n^3)
주된 개념 : stream(), bufferreader, split
풀이 방법 :
각 행의 하나의 값을 지정해두고 그 행을 돌면서 지정해둔 값과 같은지 비교를 한다.
먄약에 같다면 우선, 행에서 같은 값의 길이를 구한다. 그다음 조건 범위 내에서 길이 만큼 떨어진 곳에서의 다른 행에 같은 값이 있는지 찾는다. 이 역시 같다면 그때 그 길이를 제곱해서 넓이를 구하고, Math.max를 통해 최댓값을 도출해낸다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Scanner;
import java.util.StringTokenizer;
class Main {
private int solution(int[][] arr, int n, int m){
int answer= 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
for (int k = j; k < m; k++) {
if(arr[i][j] == arr[i][k] && i + k - j < n && arr[i + k -j][j] == arr[i][j] && arr[i + k -j][k] == arr[i][j]) {
answer = Math.max(answer, (k - j + 1)*(k - j + 1));
}
}
}
}
return answer;
}
public static void main(String[] args) throws Exception {
Main T = new Main();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] readLine = br.readLine().split(" ");
int n = Integer.parseInt(readLine[0]);
int m = Integer.parseInt(readLine[1]);
String[] tmp = new String[n];
int[][] arr = new int[n][m];
for (int i = 0; i < n; i++) {
tmp[i] = br.readLine();
}
for (int i = 0; i < n; i++) {
arr[i] = Arrays.asList(tmp[i].split(""))
.stream().mapToInt(Integer::parseInt).toArray();
}
System.out.println(T.solution(arr, n, m));
}
}
<<추가 공부>>
BufferedReader
BufferedReader와 Scanner의 차이
: 이 둘의 속도 차이가 나는 이유는 buffer 사용 여부의 차이이다.
Scanner 는 1 KB 크기의 버퍼를 갖기 때문에 입력이 바로 전달되는 반면 BufferedReader는 8KB 크기의 버퍼를 가져
buffer에 입력들을 저장하였다가 한 번에 전송하기 때문에 속도가 더 빠르다.
또한 Scanner 는 입력을 읽는 과정에서 내부에서 정규 표현식 적용, 입력값 분할, 파싱 등을 거치기 때문에 더욱 느리다.
BufferedReader 사용법
: 버퍼리더같은 경우는 한 줄 읽어서 String으로 가져온다. 그렇기 때문에 Scanner처럼 띄어쓴다고 구분되어서 입력 되는 것이 아니다.
한줄에서 띄어 쓸거면 split으로 구분해줘야 한다.
=> 추가적인 내용은 따로 블로그 정리 !
stream()
arr[i] = Arrays.asList(tmp[i].split(""))
.stream().mapToInt(Integer::parseInt).toArray();
-> 이 문법의 의미는 문자열 배열을 퍼트린 뒤, Inteter.parseInt로 각각 Integer로 바꾼 뒤 다시 toArray 배열로 만든다.
이것에 대한 내용도 따로 정리가 필요하다.
'코딩테스트' 카테고리의 다른 글
[DFS] 6. 순열 구하기 (83) | 2024.02.24 |
---|---|
[DFS] 5. 동전교환 (6) | 2024.02.24 |
[DFS] 3. 최대점수 구하기 (1) | 2024.02.22 |
[DFS] 2. 바둑이 승차 (70) | 2024.02.16 |
[DFS] 1. 합이 같은 부분집합 (3) | 2024.02.14 |