-
[Java] BOJ 2866 문자열 잘라내기개발자 취업/코딩테스트 준비 2023. 6. 11. 17:06반응형
2866번: 문자열 잘라내기
첫 번째 줄에는 테이블의 행의 개수와 열의 개수인 R과 C가 주어진다. (2 ≤ R, C ≤ 1000) 이후 R줄에 걸쳐서 C개의 알파벳 소문자가 주어진다. 가장 처음에 주어지는 테이블에는 열을 읽어서 문자
www.acmicpc.net
오답 코드
- ArrayToString 함수 : 2차원 배열을 세로 문자열로 만들어주는 함수
- O(N^3)의 시간복잡도를 가지게 되면서 시간초과 발생
import java.io.*; import java.util.*; public class Main { static BufferedReader br; static BufferedWriter bw; static StringTokenizer st; static int R, C; static char[][] arr; static Set<String> set1, set2; public static void main(String[] args) throws IOException { br = new BufferedReader(new InputStreamReader(System.in)); bw = new BufferedWriter(new OutputStreamWriter(System.out)); st = new StringTokenizer(br.readLine(), " "); R = Integer.parseInt(st.nextToken()); C = Integer.parseInt(st.nextToken()); arr = new char[R][C]; for (int i = 0; i < R; i++) { arr[i] = br.readLine().toCharArray(); } int cnt = 0; for (int i = 0; i < R - 1; i++) { set1 = new HashSet<>(); set2 = new HashSet<>(); for (int j = 0; j < C; j++) { String str1 = ArrayToString(i, j); String str2 = ArrayToString(i + 1, j); set1.add(str1); set2.add(str2); } if (set1.size() == set2.size()) { cnt++; } else if (set1.size() > set2.size()) { break; } } System.out.println(cnt); } private static String ArrayToString(int r, int c) { StringBuilder sb = new StringBuilder(); for (int i = r; i < R; i++) { sb.append(arr[i][c]); } return sb.toString(); } }
정답 코드
- 필요한 세로 문자열을 미리 생성해두고 필요할때 substring으로 잘라서 활용
- O(N^2)로 시간복잡도 감소
import java.io.*; import java.util.*; public class Main { static BufferedReader br; static BufferedWriter bw; static StringTokenizer st; static int R, C; static char[][] arr; static String[] strings; static Set<String> set1, set2; public static void main(String[] args) throws IOException { br = new BufferedReader(new InputStreamReader(System.in)); bw = new BufferedWriter(new OutputStreamWriter(System.out)); st = new StringTokenizer(br.readLine(), " "); R = Integer.parseInt(st.nextToken()); C = Integer.parseInt(st.nextToken()); arr = new char[R][C]; for (int i = 0; i < R; i++) { arr[i] = br.readLine().toCharArray(); } strings = new String[C]; for (int i = 0; i < C; i++) { strings[i] = ArrayToString(0, i); } int cnt = 0; for (int i = 0; i < R - 1; i++) { set1 = new HashSet<>(); set2 = new HashSet<>(); for (int j = 0; j < C; j++) { set1.add(strings[j].substring(i, R)); set2.add(strings[j].substring(i + 1, R)); } if (set1.size() == set2.size()) { cnt++; } else if (set1.size() > set2.size()) { break; } } System.out.println(cnt); } private static String ArrayToString(int r, int c) { StringBuilder sb = new StringBuilder(); for (int i = r; i < R; i++) { sb.append(arr[i][c]); } return sb.toString(); } }
'개발자 취업 > 코딩테스트 준비' 카테고리의 다른 글
[Java] BOJ 19583 싸이버개강총회 (0) 2023.06.11 [Java] BOJ 17479 정식당 (0) 2023.06.11 [JAVA] BOJ 1063 킹 (0) 2023.06.10 [Java] BOJ 11652 카드 (0) 2023.06.09 [Java] BOJ 1205 등수 구하기 (0) 2023.06.08