알고리즘 문제/프로그래머스
프로그래머스 0단계 문자열안에 문자열- java
가끔개발
2023. 5. 11. 14:57
문제 설명
문자열 str1, str2가 매개변수로 주어집니다. str1 안에 str2가 있다면 1을 없다면 2를 return하도록 solution 함수를 완성해주세요.
제한사항
- 1 ≤ str1의 길이 ≤ 100
- 1 ≤ str2의 길이 ≤ 100
- 문자열은 알파벳 대문자, 소문자, 숫자로 구성되어 있습니다.

문제풀이
class Solution{
public int solution(String str1, String str2) {
int n = str1.length();
int m = str2.length();
for (int i = 0; i <= n - m; i++) {
int j;
for (j = 0; j < m; j++) {
if (str1.charAt(i + j) != str2.charAt(j)) {
break;
}
}
if (j == m) {
return 1;
}
}
return 2;
}
}
처음에 이런씩으로 풀었지만 지난번에 푼 문제와 비슷해서 Stream으로 풀수 있지 않을까하고, 여러번 도전해서 풀어봤지만 자꾸 틀린 답만 내서 chatgpt에게 Stram형태로 풀어달라고 하였다.
import java.util.stream.*;
class Solution {
public int solution(String str1, String str2) {
boolean result = IntStream.rangeClosed(0, str1.length() - str2.length())
.filter(i -> str1.regionMatches(i, str2, 0, str2.length()))
.findFirst()
.isPresent();
return result ? 1 : 2;
}
}
- IntStream.rangeClosed(0, str1.length() - str2.length())은 str1의 길이에서 str2의 길이를 뺀 범위 내에서 int형 숫자 스트림을 생성합니다. 이 스트림은 str2가 str1에 들어갈 수 있는 모든 시작 인덱스를 포함합니다.
- filter 연산자를 사용하여 regionMatches 함수를 이용해 str1 문자열에서 str2와 일치하는 부분이 있는지 찾습니다. regionMatches는 두 문자열의 일부분이 일치하는지 여부를 확인합니다. filter는 스트림에서 조건에 맞는 요소만을 걸러냅니다.
- 마지막으로, findFirst를 호출하면 결과를 찾아낸 후 첫 번째 요소를 가져옵니다. 만약 결과를 찾지 못한다면 Optional.empty()를 반환합니다. 따라서 isPresent를 호출하여 결과를 확인하고, 결과가 존재한다면 1을 반환하고, 결과가 존재하지 않는다면 2를 반환합니다.
- 즉, str1 내에 str2가 존재하는지 여부를 1 또는 2의 정수값으로 반환하는 함수입니다.