코드 그라데이션

[Lv.0] 접두사인지 확인하기 본문

Java/알고리즘

[Lv.0] 접두사인지 확인하기

완벽한 장면 2023. 6. 8. 20:59

https://school.programmers.co.kr/learn/courses/30/lessons/181906

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 설명

어떤 문자열에 대해서 접두사는 특정 인덱스까지의 문자열을 의미합니다. 

예를 들어, "banana"의 모든 접두사는 "b", "ba", "ban", "bana", "banan", "banana"입니다.
문자열 my_string과 is_prefix가 주어질 때, 

is_prefix가 my_string의 접두사라면 1을, 아니면 0을 return 하는 solution 함수를 작성해 주세요.

 

제한사항

 

입출력 예

입출력 예 설명

 

아이디어

  • 문제를 처음 분석해봤을 때, 문자의 길이를 하나씩 앞에서부터 늘려 가는 것이 접두사인 듯.
  • 처음부터 연속성이라는 규칙을 가지고 있는데, 중간 부분 연속한 것은 미포함으로 처리되는 듯 하다.
  • 포함여부 + a 인 것.
  • 그래서 여기서는 is_prefix로 my_string이 시작하는지를 검사하면 된다.
  • contains() 가 맞지 않는 이유는 어디에 있든지 있기만 하면 되는 거라서...

풀이 순서

//startsWith()
//1. 길이 : my_string >= is_prefix if
//2. is_prefix의 원소의 수만큼 추출해서, 
//3. my_string에 있는지를 비교 검사. for 
//4. 리턴값 결정.

 

나의 답안 작성 과정

  • my_string이 is_prefix로 시작한다는 것의 의미는?
  • => my_string에서의 첫 번째 문자는  is_prefix 전체랑 비교할 것이 아니라, is_prefix의 첫 번째 문자랑 비교하면 된다. 

초기 코드

class Solution {
  public int solution(String my_string, String is_prefix) {
    int answer = 0;
    if(my_string.length() >= is_prefix.length()) {
      for (int i=0; i<my_string.length(); i++) {
        if (my_string.charAt(i) == is_prefix.charAt(i)) {
          return 1;
        }
      }
    }
    return 0;
  }
}
  • 이 코드는 지금 my_string.length() < is_prefix.length() 이면 무조건 0을 리턴하게 됨.
  • 뭔가 부족함.
  • 입출력 예시를 들어봤을 때, 지금은 b랑 b를 비교하고, 같으니까 바로 1을 리턴해버림.
  • 리턴은 바로 끝남을 명심

Tip

- "모든 까마귀가 검다"를 증명

=> 하나라도 하얀 까마귀를 발견하면 거짓임을 증명하면 됨.

 

  • 지금은 위 코드에서 두 개의 길이가 같아도 리턴 1, is_prefix가 더 짧아도 리턴 1이 한꺼번에 처리되고 있음.
  • my_string.length() >= is_prefix.length() 과 my_string.charAt(i) == is_prefix.charAt(i) 이
  • 이 중에 하나만이라도 분리해서 빼면 편함.
  • 지금 여기서는 길이가 짧으면 무조건 return 1을 처리하고 있는데,
  • 길이가 짧아도 무언가 더 처리를 해줄 수 있게 코드를 추가하면 된다.(바로 리턴 1 x);
  • 리턴의 위치 재조정으로 해결
  • 아래와 같이 바꿔주면 가장 마지막에 쓰인  리턴에 도달할 수 있는 경우의 수는 길이가 짧을 때밖에 없다!
  • 아까는 길이가 짧아도 되고, 정답인 경우에도 도달했었다.

 

수정한 코드

class Solution {
  public int solution(String my_string, String is_prefix) {
    int answer = 0;
    if(my_string.length() >= is_prefix.length()) {
      for (int i=0; i<my_string.length(); i++) {
        if (my_string.charAt(i) == is_prefix.charAt(i)) {
          return 0;
        }
      }
      return 1;
    }
    return 0;
  }
}
  • 그런데 이러면, index 아웃 오브 레인지 에러가 나온다.(is_prefix 가 터진 상황)
  • 잘 살펴볼 부분이 뭐냐면, is_prefix로 시작되는지만 보면 되기 때문에 is_prefix 뒤의 문자가 뭐가 나오는지는 관심사 밖이다.
  • 그러면 가운데 조건식 기준이 my_string이 아니라, is_prefix가 되면 된다!!!

 

제출한 코드

class Solution {
  public int solution(String my_string, String is_prefix) {
    int answer = 0;
    if(my_string.length() >= is_prefix.length()) {
      for (int i=0; i<is_prefix.length(); i++) {
        if (my_string.charAt(i) == is_prefix.charAt(i)) {
          return 0;
        }
      }
      return 1;
    }
    return 0;
  }
}

 

개선한 코드 - 유틸리티성 문자열 메서드 사용

class Solution {
    public int solution(String my_string, String is_prefix) {
       if(my_string.startsWith(is_prefix))  {
           return 1;
       } else {
           return 0;
       }
    }
}

 

 

 

 

728x90

'Java > 알고리즘' 카테고리의 다른 글

아스키 코드 관련  (0) 2023.06.09
[Lv.0] 뒤에서 5등 위로  (0) 2023.06.08
[Lv.0] 배열의 유사도  (0) 2023.06.08
[Lv.0] 점의 위치 구하기  (1) 2023.06.07
[Lv.0] (2문제) 공배수, n의 배수  (0) 2023.06.07
Comments