Skip to content

Commit fe10e1b

Browse files
committed
feat: boj_2195
1 parent 00b4e2a commit fe10e1b

2 files changed

Lines changed: 91 additions & 0 deletions

File tree

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/* ************************************************************************** */
2+
/* */
3+
/* ::: ::: ::: */
4+
/* Problem Number: 2195 :+: :+: :+: */
5+
/* +:+ +:+ +:+ */
6+
/* By: dmb07301 <boj.kr/u/dmb07301> +#+ +#+ +#+ */
7+
/* +#+ +#+ +#+ */
8+
/* https://boj.kr/2195 #+# #+# #+# */
9+
/* Solved: 2026/02/09 18:14:44 by dmb07301 ### ### ##.kr */
10+
/* */
11+
/* ************************************************************************** */
12+
13+
/*
14+
2195번 : 문자열 복사
15+
원본 문자열 S
16+
부분복사 문자열 P
17+
18+
copy(s,p) 함수 이용 -> S의 s부터 p개의 문자열을 P 뒤에 붙임
19+
copy 함수를 가능한 한 가장 적게 사용하는 횟수 구하기
20+
21+
최장 증가 수열인가
22+
P의 앞부분부터 검사하면서 하나씩 검사를 해?
23+
1000개면 감당이 될 수도 1000 * 1000 = 천만? 오 되나
24+
25+
p의 0부터 시작해서 s랑 검사 -> 같은거 있으면 p의 범위를 1 늘림?
26+
27+
*/
28+
29+
import java.io.*;
30+
import java.util.*;
31+
32+
public class Main{
33+
34+
private static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
35+
36+
public static void main(String[] args) throws IOException {
37+
String S = br.readLine();
38+
String P = br.readLine();
39+
40+
int ans = 0; // 횟수 계산 용도
41+
int i = 0; // p의 0번부터 시작
42+
43+
while(i < P.length()){
44+
int best = 0;
45+
46+
for(int j = 0; j < S.length(); j++){
47+
int len = 0;
48+
while (j + len < S.length() && i + len < P.length()
49+
&& S.charAt(j + len) == P.charAt(i + len)) { // 계속 비교하면서 갱신
50+
len++; // 같으면 len++ 해서 또 검사
51+
}
52+
if (len > best) best = len; // 최고값 비교
53+
}
54+
i += best;
55+
ans++;
56+
}
57+
58+
System.out.println(ans);
59+
}
60+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# 2195번: 문자열 복사 - <img src="https://static.solved.ac/tier_small/11.svg" style="height:20px" /> Gold V
2+
3+
<!-- performance -->
4+
5+
<!-- 문제 제출 후 깃허브에 푸시를 했을 때 제출한 코드의 성능이 입력될 공간입니다.-->
6+
7+
<!-- end -->
8+
9+
## 문제
10+
11+
[문제 링크](https://boj.kr/2195)
12+
13+
<p>어떤 원본 문자열 S가 주어졌을 때, 이 문자열의 부분을 복사하여 P라는 새로운 문자열을 만들려고 한다. 복사를 할 때에는 copy(s, p) 이라는 함수를 이용하는데, 이는 S의 s번 문자부터 p개의 문자를 P에 복사해서 붙인다는 의미이다.</p>
14+
15+
<p>예를 들어 S="abaabba", P="aaabbbabbbaaa"인 경우를 생각해 보자. 이때는 copy(3, 2), copy(4, 3), copy(2, 2), copy(5, 2), copy(2, 3), copy(1, 1) 를 수행하여 P를 만들 수 있다. 각 단계별로 P는 "aa", "aaabb", "aaabbba", …와 같이 변하게 된다.</p>
16+
17+
<p>이와 같은 copy 연산을 이용하여 S에서 P를 만들려고 하는데, 이때 가능하면 copy 함수를 조금 사용하려고 한다.</p>
18+
19+
<p>S와 P가 주어졌을 때, 필요한 copy 함수의 최소 사용횟수를 구하는 프로그램을 작성하시오.</p>
20+
21+
## 입력
22+
23+
<p>첫째 줄에 S, 둘째 줄에 P가 주어진다. S와 P는 영어 대소문자와 숫자로만 되어 있다. S의 길이는 1,000을 넘지 않으며, P의 길이는 1,000을 넘지 않는다. copy함수만을 이용하여 S에서 P를 만들어낼 수 없는 경우는 입력으로 주어지지 않는다고 가정하자. 각 문자열은 최소한 한 개의 문자로 이루어져 있다.</p>
24+
25+
## 출력
26+
27+
<p>첫째 줄에 copy 함수의 최소 사용횟수를 출력한다.</p>
28+
29+
## 소스코드
30+
31+
[소스코드 보기](Main.java)

0 commit comments

Comments
 (0)