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 |
Tags
- 이분탐색
- 알고리즘
- dfs
- 집합
- 프로그래머스
- 재귀
- 트리
- 그래프
- 스택
- 가중치없는그래프
- 자료구조
- algorithm
- 자바
- 반효경교수님
- 멘딕스
- SQL
- 매개변수 탐색
- microflow
- lcap
- git
- 완전탐색
- 해시맵
- Mendix
- 정렬
- Bruteforce
- 백트래킹
- MySQL
- domain model
- Recursion
- Sort
Archives
- Today
- Total
mondegreen
[240305] 알고리즘 리부트 24일차 - 백준 17232 자바 본문
알고리즘 풀이 및 리뷰/[패캠] 핵심유형 20개로 한 번에 끝내는 알고리즘 코딩테스트 리뷰
[240305] 알고리즘 리부트 24일차 - 백준 17232 자바
앙갱 2024. 3. 6. 00:41반응형
[Part1-Chapter05-Clip04]
- 백준 17232 생명게임
이전에 푼 구간합 구하기 5의 풀이 과정을 담으면 되는 문제였다. 동일한 문제였지만 *라는 문자로 변경되었다고 누적합을 생각해내지 못해서 강의를 보고 나서야 반영할 수 있었다..
누적합 배열을 별도로 만들지 않으면 원래 배열에서 변화를 주게되고 그럼 다음 원소를 탐색할 때 변경된 값을 참조하는 큰 문제가 있다. 또한 반복문을 순회하면서 변경사항을 반영하다보면 시간 복잡도가 커지기 때문에 변경되는 부분을 누적합을 먼저 구해주고 한번에 반영하는 것이 시간 초과하지 않는 방법이다.
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int t = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
int k = Integer.parseInt(st.nextToken());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
char[][] arr = new char[n + 1][m + 1];
for (int i = 1; i <= n; i++) {
String str = br.readLine();
for (int j = 1; j <= m; j++) {
arr[i][j] = str.charAt(j - 1);
}
}
while (t-- > 0) {
int[][] acc = getPrefixSum(arr);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
int aroundLives = getAroundLives(i, j, acc, k);
if (arr[i][j] == '*') {
aroundLives--; // 현재 본인은 제외
if (aroundLives < a || aroundLives > b) {
arr[i][j] = '.'; // 사망
}
} else if (aroundLives > a && aroundLives <= b) {
arr[i][j] = '*';
}
}
}
}
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
bw.write(arr[i][j]);
}
bw.write("\n");
}
bw.flush();
}
private static int getAroundLives(int r, int c, int[][] acc, int k) {
int startR = Math.max(r - k, 1);
int startC = Math.max(c - k, 1);
int endR = Math.min(r + k, acc.length - 1);
int endC = Math.min(c + k, acc[0].length - 1);
return acc[endR][endC] - acc[startR - 1][endC] - acc[endR][startC - 1] + acc[startR - 1][startC - 1];
}
private static int[][] getPrefixSum(char[][] arr) {
int[][] acc = new int[arr.length][arr[0].length];
for (int i = 1; i < arr.length; i++) {
for (int j = 1; j < arr[0].length; j++) {
acc[i][j] = acc[i - 1][j] + acc[i][j - 1] - acc[i - 1][j - 1] + (arr[i][j] == '*' ? 1 : 0);
}
}
return acc;
}
}
반응형
'알고리즘 풀이 및 리뷰 > [패캠] 핵심유형 20개로 한 번에 끝내는 알고리즘 코딩테스트 리뷰' 카테고리의 다른 글
[240307] 알고리즘 리부트 26일차 - 백준 2295 자바 (1) | 2024.03.07 |
---|---|
[240306] 알고리즘 리부트 25일차 - 백준 1920, 14425 자바 (0) | 2024.03.06 |
[240301] 알고리즘 리부트 21일차 - 백준 11659, 11660, 19951 자바 (0) | 2024.03.01 |
[240229] 알고리즘 리부트 20일차 - 백준 1931 자바 (2) | 2024.02.29 |
[240226] 알고리즘 리부트 17일차 - 백준 2910 자바 (0) | 2024.02.25 |