https://school.programmers.co.kr/learn/courses/30/lessons/147355
문제
숫자로 이루어진 문자열 t와 p가 주어질 때, t에서 p와 길이가 같은 부분문자열 중에서, 이 부분문자열이 나타내는 수가 p가 나타내는 수보다 작거나 같은 것이 나오는 횟수를 return하는 함수 solution을 완성하세요.
예를 들어, t="3141592"이고 p="271" 인 경우, t의 길이가 3인 부분 문자열은 314, 141, 415, 159, 592입니다. 이 문자열이 나타내는 수 중 271보다 작거나 같은 수는 141, 159 2개 입니다.
풀이
문자열 t에서 길이가 p와 같은 부분 문자열을 추출하여, 부분 문자열과 p의 크기를 비교한 후 p보다 작거나 같은 부분 문자열의 개수를 return 하는 문제이다.
필자는 p의 범위가 int를 초과하기 때문에, 숫자로 변환하지 않고 문자열끼리 크기를 비교하였다.
🔔 자세한 코드 설명은 더보기 란에 작성하였습니다.
1. 반복문은 부분 문자열의 개수만큼 돌렸고, 가장 큰 자리 수부터 비교하였다.
for(j = 0; j < subT.length(); j++)
2-1. p의 j번째 자리 수가 subT(부분문자열)의 j번째 자리 수보다 크면 무조건 p >= subT이므로 answer에 1을 추가하고, break 한다.
if(subT.charAt(j) < p.charAt(j)) {
answer++;
break;
}
2-2. 두 문자열의 j번째 자리 수가 같으면 크기를 비교할 수 없으므로 continue 한다.
단 일의 자릿수가 같다면 p == subT이기 때문에, 조건을 만족하므로 answer에 1을 추가한다.
else if(subT.charAt(j) == p.charAt(j)) {
if(j == subT.length() - 1) answer++;
continue;
}
2-3. subT의 j번째 자리 수가 p의 j번째 자리 수보다 크면 조건을 만족하지 않으므로 break 한다.
else break;
다른 사람들의 풀이를 보니, Long으로 푼 코드가 많았다.
Long의 범위는 초과하지 않는다는 것을 간과해서 조금 어렵게 푼 것 같다..
코드
class Solution {
public int solution(String t, String p) {
int answer = 0;
int len = p.length();
for(int i = 0; i < t.length() - len + 1; i++) {
String subT = t.substring(i, i + len);
int j;
for(j = 0; j < subT.length(); j++) {
if(subT.charAt(j) < p.charAt(j)) {
answer++;
break;
}
else if(subT.charAt(j) == p.charAt(j)) {
if(j == subT.length() - 1) answer++;
continue;
}
else break;
}
}
return answer;
}
}
틀린 부분이 있다면 정정해 주시면 감사하겠습니다.
궁금한 부분이 있거나, 다른 아이디어가 있으시면 자유롭게 댓글 남겨주세요!
'[JAVA]프로그래머스 > Lv.1' 카테고리의 다른 글
[JAVA]프로그래머스 - 둘만의 암호 (0) | 2024.04.12 |
---|---|
[JAVA]프로그래머스 - 숫자 문자열과 영단어 (0) | 2024.04.10 |
[JAVA]프로그래머스 - 삼총사 (0) | 2024.04.09 |
[JAVA]프로그래머스 - 바탕화면 정리 (0) | 2024.04.07 |
[JAVA]프로그래머스 - 달리기 경주 (0) | 2024.04.05 |