[개발] - 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
반응형