[BOJ] 2866 문자열 잘라내기 - JAVA

ONE·2022년 4월 19일
0

Baekjoon Online Judge

목록 보기
14/16

📚 Problem

2866 문자열 잘라내기

📝 Solution

Key Idea

  • 입력받은 문자열들의 세로로 문자열들을 넣은 List 를 최초에 한번만 생성
  • 가장 위의 행을 제외한 세로 문자열들에 중복이 없다면
  • 실제로 문자열 하나를 삭제하는 것이 아닌 idx 를 증가시켜 세로 문자열들의 앞에서 하나씩 잘라준다
  • 중복검사는 세로 문자열들을 Mapkey 로 넣고 value는 개수로 둬서
  • 만약 value 가 2이상이라면 중복이 발생한 것이므로 count 개수를 출력하고 프로그램을 종료한다
  • 중복이 발생하지 않았다면 count++ 하고 idx++ 해주어 가장위의 행을 지운 것과 같은 효과를 본다
    private static boolean isDup(ArrayList<String> list, int idx) {
        Map<String, Integer> map = new HashMap<>();

        for (String col : list){
            col = col.substring(idx);
            map.put(col, map.getOrDefault(col, 0) + 1);

            if (map.get(col) >= 2)
                return true;
        }
        return false;
    }

💻 Code

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
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 = new StringTokenizer(br.readLine(), " ");

        int count = 0, idx = 1;
        int R = Integer.parseInt(st.nextToken());
        int C = Integer.parseInt(st.nextToken());
        ArrayList<String> list = new ArrayList<>();

        for(int i = 0; i < R; i++)
            list.add(br.readLine());

        ArrayList<String> colStrings = makeCols(list, C);

        while (true) {
            if (isDup(colStrings, idx)) {
                System.out.println(count);
                break;
            } else {
                count++;
                idx++;
            }
        }
    }

    private static ArrayList<String> makeCols(ArrayList<String> list, int C) {
        ArrayList<String> temp = new ArrayList<>();

        for (int i = 0; i < C; i++) {
            StringBuilder builder = new StringBuilder();

            for (String s : list)
                builder.append(s.charAt(i));

            temp.add(builder.toString());
        }
        return temp;
    }
    private static boolean isDup(ArrayList<String> list, int idx) {
        Map<String, Integer> map = new HashMap<>();

        for (String col : list){
            col = col.substring(idx);
            map.put(col, map.getOrDefault(col, 0) + 1);

            if (map.get(col) >= 2)
                return true;
        }
        return false;
    }
}
profile
New, Strange, Want to try

0개의 댓글