알고리즘/백준
[백준] 16500번 : 문자열 판별 - 자바(Java)
Junuuu
2022. 7. 29. 00:01
반응형
https://www.acmicpc.net/problem/16500
16500번: 문자열 판별
첫째 줄에 길이가 100이하인 문자열 S가 주어진다. 둘째 줄에는 A에 포함된 문자열의 개수 N(1 ≤ N ≤ 100)이 주어진다. 셋째 줄부터 N개의 줄에는 A에 포함된 단어가 한 줄에 하나씩 주어진다. A에
www.acmicpc.net
문제 해석
알파벳 소문자로 이루어진 문자열 S가 있습니다
알파벳 소문자로 이루어진 단어 A가 있습니다.
이때 A에 포함된 단어목록을 한 개 이상 공백없이 붙여서 만들 수 있는지 없는지 구하는 프로그램을 작성하세요.
문자열 S의 길이는 100이하입니다.
A의 개수도 100개이하입니다.
문자열 S : softwarecontest
단어A : software, contest
단어A를 2개 붙이면 softwarecontest가 완성되기 때문에 만들 수 있으면 1출력
문제 풀이 전 설계
문자열 S가 100의 길이를 가지고 단어 100개가 각각 1개의 길이를 가지는 최악의 경우에 모든 경우를 탐색해보면
100^100의 시간복잡도가 나오게 됩니다.
느낌은 DP를 사용해야 할 것 같습니다.
문제 풀이
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;
public class Main_16500_문자열판별 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//문자열 S 입력받기
String s = br.readLine();
//단어 N개
int n = Integer.parseInt(br.readLine());
Set<String> words = new HashSet<>();
// 포함되는 단어인지 체크하기 위한 단어들 입력받기
for (int i = 0; i < n; i++) {
words.add(br.readLine());
}
int[] dp = new int[101];
//뒤에서 부터 탐색시작
for (int i = s.length() - 1; i >= 0; i--) {
//i+1부터 끝까지 반복
for (int j = i + 1; j < s.length(); j++) {
//S[j~끝]까지 만들 수 있는 문자가 존재한다면
if (dp[j] == 1) {
//S[i-j]까지 만들 수 있는 문자가 존재한다면
if (words.contains(s.substring(i, j)))
//DP[i] = 1 으로 변경 이는 S[i~끝]까지 만들 수 있음
dp[i] = 1;
}
}
// 자르고 남은 부분 문자가 포함되어 있으면 1
// S의 뒷자리부터 0까지 순서대로 문자열을 substring으로 잘라 A에 속해있는지 확인한다.
//ex) softwarecontest
// t, st, est, test, ntest, ontest, contest .....
//이때 contest가 words에 포함되었기 때문에 dp[8] = 1;
if (words.contains(s.substring(i))) {
dp[i] = 1;
}
}
System.out.println(dp[0]);
}
}
출처
[알고리즘] 백준 > #16500. 문자열판별
피곤해죽을거같지만 문제를 풀었다 ㅠ\[백준 테스트케이스가 딱 하나다. 그리고 그 테스트케이스는 너무 불친절해서 문제를 똑바로 이해하지 못하기 딱 좋다. 처음에 주어진 테스트케이스를 봤
velog.io