본문 바로가기
코딩테스트/자바 Level 0

[Java] k의 개수

by onggury 2023. 7. 5.

문제

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