[백준, BOJ 2866] 문자열 잘라내기 (java)
Problem Solving/BOJ

[백준, BOJ 2866] 문자열 잘라내기 (java)

728x90

https://www.acmicpc.net/problem/2866

 

2866번: 문자열 잘라내기

첫 번째 줄에는 테이블의 행의 개수와 열의 개수인 R과 C가 주어진다. (2 ≤ R, C ≤ 1000) 이후 R줄에 걸쳐서 C개의 알파벳 소문자가 주어진다. 가장 처음에 주어지는 테이블에는 열을 읽어서 문자

www.acmicpc.net

728x90

메모리: 305,588 KB , 시간: 1,748  ms

사용 알고리즘: 자료 구조, 해시를 사용한 집합과 맵, 문자열

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.StringTokenizer;

public class Main {

    public static void main(String[] args) throws Exception{

        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[][] table = new char[R][C];
        for (int i = 0; i < R; i++) {
            table[i] = br.readLine().toCharArray();
        }

        // 열 별로 StringBuilder에 담아 문자열을 만들어줌
        StringBuilder[] arr = new StringBuilder[C];
        for (int i = 0; i < C; i++) {
            arr[i] = new StringBuilder();
            for (int j = 0; j < R; j++) {
                arr[i].append(table[j][i]);
            }
        }

        int count = 0;
        HashSet<String> hs;
        boolean flag;
        while(true) {
            hs = new HashSet<>();
            flag = false;

            for (int i = 0; i < C; i++) {
                arr[i].delete(0, 1);
                if(hs.contains(arr[i].toString())) {
                    flag = true;
                    break;
                }
                else hs.add(arr[i].toString());
            }

            if(flag) break;
            count++;
        }

        System.out.println(count);
    }
}
728x90