백준 21941[자바] java 문자열 제거
문제 링크: https://www.acmicpc.net/problem/21941
21941번: 문자열 제거
지우고 싶은 문자열 $S$와 지울 수 있는 문자열 $A_{1}$, $A_{2}$, ..., $A_{M}$이 주어진다. 문자열 $A_{i}$들은 각자 $X_{i}$라는 점수를 가진다. 이 때, 문자열 $S$를 삭제 연산을 이용하여 모두 제거하려
www.acmicpc.net
▶문제
지우고 싶은 문자열 S와 지울 수 있는 문자열 A1, A2,...,AM이 주어진다. 문자열 Ai들은 각자 Xi라는 점수를 가진다. 이때, 문자열 S를 삭제 연산을 이용하여 모두 제거하려고 한다.
삭제 연산은 두 가지 방법이 존재하며, 원하는 만큼 여러 번에 걸쳐서 수행할 수 있다.
- 문자열 S의 부분 문자열 중에 문자열 Ai 가 존재한다면 해당하는 부분을 지우고 Xi 만큼의 점수를 얻는다(여러 부분 존재해도 한 번만 지운다).
- 문자열 S에서 문자 하나를 지우고 점수를 1점을 얻을 수 있다.
예를 들어, 문자열 S가 "abcxyzxabc"이 있고 "abc" 문자열을 지울 경우 10점, "xyz" 문자열을 지울 경우 5점을 얻는다고 하자. 문자열을 모두 제거하여 최대 점수를 얻을 수 있는 과정은 아래와 같다.
- 문자열 S에서 문자열 "xyz" 하나를 지운다. 현재 총 얻은 점수는 5점이고 문자열 S는 "abc___xabc"가 된다. 이때, '_'는 문자가 지워진 자리를 의미한다.
- 문자열 S에서 문자열 "abc" 하나를 지운다. 현재 총 얻은 점수는 15점이고 문자열 S는 "______xabc"가 된다.
- 문자열 S에서 문자열 "abc" 하나를 지운다. 현재 총 얻은 점수는 25점이고 문자열 S는 "______x___"가 된다.
- 남은 문자들을 하나씩 지운다. 현재 총 얻은 점수는 26점이고 문자열 S는 빈 문자열이 된다.
문자열을 모두 제거하여 얻을 수 있는 최대 점수는 26점이다. 이보다 더 얻을 수 있는 점수는 없다.
삭제 연산을 이용하여 문자열 S을 지우려고 할 때 얻을 수 있는 최대 점수는 몇 점인지 계산하자.
▶입력
첫 번째 줄에는 문자열 S이 주어진다.
두 번째 줄에는 지울 수 있는 문자열 개수 M이 주어진다.
세 번째 줄부터 M+2 줄까지 문자열 Ai와 점수 Xi이 공백으로 구분되어 주어진다.
▶출력
문자열 S를 모두 제거하여 얻을 수 있는 점수를 출력하자.
▶해설
조건을 살펴보겠습니다.
1. 주어진 문자열에서 하나씩만 삭제 가능하다.
2. 지우지 않은 문자열은 1로 계산된다.
숫자를 키워나가며, 가장 큰 값을 찾는 DP 문제입니다.
String.startsWith()을 사용하겠습니다. startsWith(String, index) -> 인자로 들어간 문자열이 index부터 탐색하기 시작했을 때 부합한 지 판별해주는 메서드입니다.
만약 부합하다면 저희는 탐색을 시작한 index+cost(문자열을 뺐을 때 얻는 값)과 기존에 있던 값을 비교하여 큰 값을 찾아주면 됩니다. 아래와 같은 점화식이 만들어집니다.
dp[i +now.s.length()] = Math.max(dp[i + now.s.length()], dp[i] + now.cost);
여기서 주의할 점은 탐색을 시작하기 전 아래의 과정을 거쳐야 합니다. 부합한 문자열이 없어 빼지 않았을 때 1을 더해주는 로직입니다.
dp[i + 1] = Math.max(dp[i+1], dp[i] + 1);

전체 코드
import java.io.*; import java.util.*; class str{ String s; int cost; public str(String s, int cost) { this.s = s; this.cost = cost; } } public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader (new InputStreamReader (System.in)); String s = br.readLine(); int length = s.length(); int m = Integer.parseInt(br.readLine()); List<str> list = new ArrayList<>(); for (int i=0 ; i < m; i++){ String[] s1 = br.readLine().split(" "); String a = s1[0]; int cost = Integer.parseInt(s1[1]); list.add(new str(a,cost)); } int [] dp = new int[length+1]; for (int i = 0; i < s.length(); i++){ dp[i + 1] = Math.max(dp[i+1], dp[i] + 1); for (int j = 0; j < m; j++){ str now = list.get(j); if (s.startsWith(now.s, i)){ dp[i +now.s.length()] = Math.max(dp[i + now.s.length()], dp[i] + now.cost); } } } System.out.println(dp[s.length()]); } }

'Alogorithm > DP' 카테고리의 다른 글
백준 10844[자바] java 쉬운 계단 수 (0) | 2022.03.17 |
---|---|
백준 18427[자바] java 함께 블록 쌓기 (0) | 2022.03.15 |
백준 17485[자바] java 진우의 달 여행 (0) | 2022.03.13 |
백준 15990 [자바] java 1, 2, 3 더하기 5 (0) | 2022.03.09 |
백준 5557[자바] java 1학년 (0) | 2022.03.07 |
댓글
이 글 공유하기
다른 글
-
백준 10844[자바] java 쉬운 계단 수
백준 10844[자바] java 쉬운 계단 수
2022.03.17문제 링크:https://www.acmicpc.net/problem/10844 10844번: 쉬운 계단 수 첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다. www.acmicpc.net ▶문제 45656이란 수를 보자. 이 수는 인접한 모든 자리의 차이가 1이다. 이런 수를 계단 수라고 한다. N이 주어질 때, 길이가 N인 계단 수가 총 몇 개 있는지 구해보자. 0으로 시작하는 수는 계단수가 아니다. ▶입력 첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 100보다 작거나 같은 자연수이다. ▶출력 첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다. ▶해설 조건을 살펴보겠습니다. 1. 인접한 모든 자리의 차이가 1인 수들 2. 1,000,000,000 으로 나… -
백준 18427[자바] java 함께 블록 쌓기
백준 18427[자바] java 함께 블록 쌓기
2022.03.15문제 링크: https://www.acmicpc.net/problem/18427 18427번: 함께 블록 쌓기 첫째 줄에 자연수 N, M, H가 공백을 기준으로 구분되어 주어진다. (1 ≤ N ≤ 50, 1 ≤ M ≤ 10, 1 ≤ H ≤ 1,000) 둘째 줄부터 N개의 줄에 걸쳐서 각 학생이 가진 블록들의 높이가 공백을 기준으로 구 www.acmicpc.net ▶문제 1번부터 N번까지의 학생들은 각각 블록들을 가지고 있다. 학생마다 최대 M개의 블록을 가지고 있을 수 있으며, 한 명의 학생이 가지고 있는 모든 블록들의 높이는 서로 다르다. 이때 1번부터 N번까지의 학생들이 가진 블록을 차례대로 사용하여 바닥에서부터 쌓아 올려 하나의 탑을 만들고자 한다. 단, 어떤 학생의 블록은 사용하지 않아도 되며 한… -
백준 17485[자바] java 진우의 달 여행
백준 17485[자바] java 진우의 달 여행
2022.03.13문제 링크: https://www.acmicpc.net/problem/17485 17485번: 진우의 달 여행 (Large) 첫줄에 지구와 달 사이 공간을 나타내는 행렬의 크기를 나타내는 N, M (2 ≤ N, M ≤ 1000)이 주어진다. 다음 N줄 동안 각 행렬의 원소 값이 주어진다. 각 행렬의 원소값은 100 이하의 자연수이다. www.acmicpc.net ▶문제 우주비행이 꿈이었던 진우는 음식점 '매일매일 싱싱'에서 열심히 일한 결과 달 여행에 필요한 자금을 모두 마련하였다! 지구와 우주 사이는 N X M 행렬로 나타낼 수 있으며 각 원소의 값은 우주선이 그 공간을 지날 때 소모되는 연료의 양이다. [예시] 진우는 여행경비를 아끼기 위해 조금 특이한 우주선을 선택하였다. 진우가 선택한 우주선의 특… -
백준 15990 [자바] java 1, 2, 3 더하기 5
백준 15990 [자바] java 1, 2, 3 더하기 5
2022.03.09문제 링크: https://www.acmicpc.net/problem/15990 15990번: 1, 2, 3 더하기 5 각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 1,000,000,009로 나눈 나머지를 출력한다. www.acmicpc.net ▶문제 정수 4를 1, 2, 3의 합으로 나타내는 방법은 총 3가지가 있다. 합을 나타낼 때는 수를 1개 이상 사용해야 한다. 단, 같은 수를 두 번 이상 연속해서 사용하면 안 된다. 1+2+1 1+3 3+1 정수 n이 주어졌을 때, n을 1, 2, 3의 합으로 나타내는 방법의 수를 구하는 프로그램을 작성하시오. ▶입력 첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 n이 주어진다. n…
댓글을 사용할 수 없습니다.