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
2) 예시
Result Table
i
j
k
result
1
13
1
6
10
50
5
5
3
10
2
0
입출력 예 #1 본문과 동일합니다.
입출력 예 #2 10부터 50까지 5는 15, 25, 35, 45, 50 총 5번 등장합니다. 따라서 5를 return 합니다.
입출력 예 #3 3부터 10까지 2는 한 번도 등장하지 않으므로 0을 return 합니다.
3) 풀이
1. 클래스 선언을 해줍니다
● class Solution {
클래스명은 대문자로 시작해야하고, 정답이라는 의미로 Solution이라는 단어를 사용하였습니다.
2. 정수 i, j, k 세개를 매개변수로 하는 solution 메소드를 선언합니다.
solution은 정수를 반환하므로 데이터타입을 int으로 합니다.
● public int solution(int i, int j, int k) {
3. 포함된 k의 개수를 정수 answer로 정의하고 0으로 초기화하여 줍니다.
● int answer = 0;
4. 문제의 제한사항을 통해 i가 j보다 작다는 사실을 알 수 있습니다.
따라서 i부터 j까지 순회하며 k가 속해있는지 여부를 확인합니다.
현재의 숫자를 저장하기 위하여 정수 current를 생성하고,
current를 10으로 나눈 나머지가 k (즉, k를 포함한다면)라면 answer값을 1 더해줍니다.
그 후 current를 10으로 나눠주는 과정을 반복합니다.
for문의 반복이 종료되면 최종적으로 answer를 반환합니다.
● for (int num = i; num <= j; num++) { int current = num; while (current > 0) { if (current % 10 == k) { answer++; } current /= 10; } }
return answer; } }
4) 코드
class Solution {
public int solution(int i, int j, int k) {
int answer = 0;
for (int num = i; num <= j; num++) {
int current = num;
while (current > 0) {
if (current % 10 == k) {
answer++;
}
current /= 10;
}
}
return answer;
}
}
5) 느낀점
● 처음 제출했었던 오답
문제를 항상 잘읽자...는 교훈을 얻었습니다.
k는 문제에서 범위를 0이상 9이하로 제한되어있기때문에 k의 자릿수를 확인하는 과정은 불필요했습니다.
(그리고 while문을 썼어야함)
또한, c(문자)와 y(숫자)의 비교는 불가하기에 항상 결과값이 0이 나오는 오류가 발생하였습니다.
class Solution {
public int solution(int i, int j, int k) {
int answer = 0;
// k가 몇단위자리 숫자인지 계산
// for문으로 range범위 내를 순회하고 char를 이용하여 그 숫자가 k를 포함하는지 또 순회하여 확인
int range = 0;
if(k/10 > 0){
range ++;
}
String strK = Integer.toString(k);
for(int y = i; y < j+1; y++){
for(int z = 0; z < range; z++){
char c = strK.charAt(z);
if(y == c){
answer ++;
}
}
}
return answer;
}
}