문제
1부터 13까지의 수에서, 1은 1, 10, 11, 12, 13 이렇게 총 6번 등장합니다. 정수 i, j, k가 매개변수로 주어질 때, i부터 j까지 k가 몇 번 등장하는지 return 하도록 solution 함수를 완성해주세요.
제한사항
- 1 ≤ i < j ≤ 100,000
- 0 ≤ k ≤ 9
class Solution {
public int solution(int i, int j, int k) {
int answer = 0;
for(int num = i; num <= j; num++) {
String numStr = Integer.toString(num);
for(int s = 0; s < numStr.length(); s++) {
if(numStr.charAt(s)-'0' == k) {
answer += 1;
}
}
}
return answer;
}
}
예를 들어 1을 찾는데 12, 13 이런 건 하나씩 들어있다고 가정하지만, 11 이나 111은 어떻게 연산해야하지 라고 한참 고민하다가 131은 어떻게 처리해야 하나 싶어서 결국 완전탐색으로 돌아섰다.
다른 사람 풀이를 보니 정말 기가 막힌 아이디어가 있었다.
i 부터 j까지의 값을 모두 문자열로 바꿔 하나의 문자열로 전부 더해나간 후, 더해서 만든 문자열의 길이 - k를 빈 문자열로 바꾼 길이를 하면 구할 수 있었다.
예를 들어 "11213" 이란 길이 5의 문자열이 주어졌는데 1의 개수를 구하려고 1을 빈 문자열로 바꾸면 "23"이라는 길이 2의 문자열이 남게 된다. 5 - 2 = 3, 즉 1의 개수는 3개라는 값이 나온다.
class Solution {
public int solution(int i, int j, int k) {
String str = "";
for(int a = i; a <= j; a++) {
str += a+"";
}
return str.length() - str.replace(k+"", "").length();
}
}
문자열 변환도 (숫자+"") 로 할 수 있다는 것을 새삼 깨닫게 되었다. 만약 (1 + 2 + "") 라고 하면 "3" 이란 결과가 나온다. 그런데 반대로 ("" + 1 + 2) 로 하게 되면 "12"가 나온다. 덧셈만 있기 때문에 앞에서부터 연산이 되기 때문이다.
이와 마찬가지로 (1 + "" + 2) 도 "12"가 나온다.
출처
https://school.programmers.co.kr/learn/courses/30/lessons/120887