코딍코딍
코딩기록
코딍코딍
전체 방문자
오늘
어제
  • 분류 전체보기 (271)
    • 개발 (2)
    • Java (1)
    • 스프링 (28)
    • JPA (11)
    • Git (3)
    • 알고리즘 (160)
      • 백준 (132)
      • 프로그래머스 (8)
      • SWEA (20)
    • 토이 프로젝트 (14)
      • 간단한 Springboot CRUD (1)
      • 게시판 프로젝트 (13)
    • 알고리즘 개념정리 (8)
    • 오류 해결 (13)
    • 보류 (0)
    • AWS (5)
    • 트러블 슈팅 (0)
    • 회고 (3)
    • CS (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

최근 글

티스토리

hELLO · Designed By 정상우.
코딍코딍

코딩기록

알고리즘/백준

[백준] 24524번 : 아름다운 문자열

2023. 11. 25. 10:53

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

 

24524번: 아름다운 문자열

첫째 줄과 둘째 줄에 영어 소문자로만 이루어진 문자열 $S$와 $T$가 각각 주어진다. $(1\leq \left|S \right|\leq 1\,000\,000;$ $1\leq \left|T \right|\leq 26;$ $\left|T \right|\leq \left|S \right|)$ $T$의 모든 문자는 서로 다

www.acmicpc.net

 

문제

당신은 문자열 S를 선물 받았다. 하지만 당신은 오직 문자열 T만을 아름답다고 생각하기 때문에 기쁘지 않다. 당신은 같은 종류의 문자가 두 번 이상 나오는 것을 질색하기 때문에, T 역시 모든 문자가 서로 다르다.

그러던 당신에게 좋은 생각이 떠올랐다. 바로 S의 문자들을 골라내서 T를 만드는 것이다! 당신은 
S에서 문자들을 골라내서 S 에서의 순서대로 이어 붙여 새 문자열을 만드는 시행을 여러 번 반복할 수 있다. 이때 
S의 각 문자는 최대 한 번씩 골라낼 수 있다. 예를 들어, S가 "aabb"이면 첫 번째 문자 "a"와 세 번째 문자 "b"를 골라 문자열 "ab"를 만들고, 다시 두 번째 문자 "a"와 네 번째 문자 "b"를 골라 문자열 "ab"를 만들 수 있다.

당신은 T를 가능한 한 많이 만들고 싶다. 만들 수 있는 T의 최대 개수를 구하는 프로그램을 작성해보자.

 

입력

첫째 줄과 둘째 줄에 영어 소문자로만 이루어진 문자열 S와 T가 각각 주어진다.

(1<= S <= 1,000,000; 1<= T <= 26; T <= S)

 

T의 모든 문자는 서로 다르다.

 

출력

첫째 줄에 만들 수 있는 T의 최대 개수를 출력한다.

 


소스코드

import java.io.*;
import java.util.HashMap;

class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String s = br.readLine();
        String t = br.readLine();

        HashMap<Character, Integer> map = new HashMap<>();
        for (int i = 0; i < t.length(); i++) {
            map.put(t.charAt(i), i);
        }

        int arr[] = new int[t.length()];
        for (int i = 0; i < s.length(); i++) {
            Integer idx = map.get(s.charAt(i));
            if (idx == null) continue;

            boolean flag = true;
            for (int j = idx; j > 0; j--) {
                // arr[idx]에 1 증가할 것이므로, j가 idx일때는 같아선 안 된다.
                if(j == idx && arr[j] == arr[j-1]){
                    flag = false;
                    break;
                }
                if (arr[j] > arr[j - 1]) {
                    flag = false;
                    break;
                }
            }

            if (flag) arr[idx] += 1;
        }

        int result = Integer.MAX_VALUE;
        for (int i = 0; i < arr.length; i++) {
            if (result > arr[i]) result = arr[i];
        }

        System.out.println(result);
    }
}

 

해결 방법

  1. 문자열 S를 문자열 T로 만들기 위해서 T에 있는 각각의 문자가 S에 몇 개 존재하는지 배열에 저장해야 한다.
  2. 단순히 세는 것이 아닌, 배열이 오름차순을 이루고 있거나 왼쪽 값과 같을때만 세서 배열에 넣어줘야 한다. 한마디로 arr[i] >= arr[i-1] 조건을 만족하는 경우에만 넣으면 된다.
  3. 주의 사항으로 현재 배열에 값을 저장할 문자는 반드시 왼쪽 값보다 작아야 한다. 그래야 1을 증가시켜도 >= 조건을 만족한다. 

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 2526번 : 싸이클  (1) 2023.11.27
[백준] 15686번 : 치킨 배달  (2) 2023.11.26
[Baekjoon] 28324번 : 스케이트 연습  (0) 2023.11.24
[Baekjoon] 2023번 : 신기한 소수  (1) 2023.11.21
2636번 : 치즈  (1) 2023.10.26
    '알고리즘/백준' 카테고리의 다른 글
    • [백준] 2526번 : 싸이클
    • [백준] 15686번 : 치킨 배달
    • [Baekjoon] 28324번 : 스케이트 연습
    • [Baekjoon] 2023번 : 신기한 소수
    코딍코딍
    코딍코딍
    ㅎ2

    티스토리툴바