알고리즘 문제/프로그래머스

프로그래머스 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;
    }
}
  1. IntStream.rangeClosed(0, str1.length() - str2.length())은 str1의 길이에서 str2의 길이를 뺀 범위 내에서 int형 숫자 스트림을 생성합니다. 이 스트림은 str2가 str1에 들어갈 수 있는 모든 시작 인덱스를 포함합니다.
  2.  filter 연산자를 사용하여 regionMatches 함수를 이용해 str1 문자열에서 str2와 일치하는 부분이 있는지 찾습니다. regionMatches는 두 문자열의 일부분이 일치하는지 여부를 확인합니다. filter는 스트림에서 조건에 맞는 요소만을 걸러냅니다.
  3. 마지막으로, findFirst를 호출하면 결과를 찾아낸 후 첫 번째 요소를 가져옵니다. 만약 결과를 찾지 못한다면 Optional.empty()를 반환합니다. 따라서 isPresent를 호출하여 결과를 확인하고, 결과가 존재한다면 1을 반환하고, 결과가 존재하지 않는다면 2를 반환합니다.
  4. 즉, str1 내에 str2가 존재하는지 여부를 1 또는 2의 정수값으로 반환하는 함수입니다.

Stram 함수좀 공부를 더해야겠다.