반응형
백준 문자열 잘라내기
https://www.acmicpc.net/problem/2866
접근 방식
문제 이해가 엄청 오래 걸렸던 문제..
1000의 범위이기에 Set만 사용해서 처리해도 풀리는 문제 But 공부하기 위해 이분탐색으로 구현!
각 행을 지울 때 마다 바뀌는 세로문자열에 중복값을 있는지 없는지 찾는 문제
구현 방법
- 세로 문자열 전체를 크게 저장할 StringBuilder[] 배열
- 중복체크를 위한 Set자료구조
- 중복에 걸린 것을 확인하기 위한 boolean값 flag
⇒ center는 행의 수라는 ****점을 확실하게 인지하고 진행한다면 할만할 것
행의 수를 center로 잡고 중복 값이 걸렸다면 행이 잘리기 이전 값도 똑같이 중복이란 점을 생각 →
flag 작동 시 right = center - 1;
flag 미작동 시 중복이 걸리지 않았기 때문에 left = center + 1;
풀이
package Baekjoon.gold;
import java.io.*;
import java.util.*;
//행을 지울때 마다 그 때의 세로문자열들 중에 중복값이 있느냐
public class p2866 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int r = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
char[][] a = new char[r][c];
for (int i = 0; i < r; i++) {
a[i] = br.readLine().toCharArray();
}
StringBuilder[] sb = new StringBuilder[c];
for (int i = 0; i < c; i++) {
sb[i] = new StringBuilder();
}
for (int i = 0; i < c; i++) {
for (int j = 0; j < r; j++) {
sb[i].append(a[j][i]);
}
}
if (r == 2) {
System.out.println(0);
return;
}
int left = 0;
int right = r;
int minValue = Integer.MAX_VALUE;
boolean flag;
//center는 행의 수
while (left <= right) {
flag = false;
int center = (left + right) / 2;
Set<String> set = new HashSet<>();
for (int i = 0; i < c; i++) {
String s = sb[i].substring(center, r);
if (!set.add(s)) {
minValue = center;
flag = true;
}
}
if (flag) {
right = center - 1;
} else {
left = center + 1;
}
}
if (minValue == Integer.MAX_VALUE) {
System.out.println(0);
} else {
System.out.println(minValue - 1);
}
}
}
후기
의외로 이분탐색의 아이디어보다 문제 이해하는데 더 힘들었던 문제… 이분탐색인걸 알고 풀어서 그런 것 같긴 하다. 또 Set만을 사용해도 풀리는 것을 확인했는데 효율이 매우 좋지 않았었음
반응형
'공부 > Algorithm' 카테고리의 다른 글
백준 25916 싫은데요 자바로 풀어 본 짧은 글 (1) | 2023.12.21 |
---|---|
백준 16987 계란으로 계란치기 자바로 풀어 본 짧은 글 (0) | 2023.12.13 |
백준 2805 나무 자르기 자바로 풀어 본 짧은 글 (2) | 2023.12.03 |
백준 16401 과자 나눠주기 자바로 풀어 본 짧은 글 (0) | 2023.12.02 |
백준 29812번 아니 이게 왜 안돼 자바로 풀어 본 짧은 글 (0) | 2023.12.01 |