/ ALGORITHM

k의 개수 구하기

Algorithm 관련 포스팅

이 글은 프로그래머스의 k의 개수 문제의 풀이를 정리한 것입니다.

문제 설명

1부터 13까지의 수에서, 1은 1, 10, 11, 12, 13 이렇게 총 6번 등장합니다. 정수 ijk가 매개변수로 주어질 때, i부터 j까지 k가 몇 번 등장하는지 return 하도록 solution 함수를 완성해주세요.


제한사항

  • 1 ≤ i < j ≤ 100,000
  • 0 ≤ k ≤ 9

입출력 예

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 합니다.

나의 풀이(1)

  1. 주어진 숫자를 하나씩 돌면서 비교
  2. 주어진 숫자를 tmp변수에 넣고
  3. tmp를 10으로 나눈 나머지가 k이면 answer를 1증가시킴

    → 이는 tmp의 일의 자리 숫자에 있는 k를 가리킴

  4. tmp의 일의 자리 숫자 비교가 끝났으니 다음 자리(십의 자리) 숫자를 비교함

    → 다음 자리 숫자가 없으면 10으로 나눈 몫은 0이 됨

  5. 다음 자리 숫자가 있을 때까지 비교

    → 다음 자리 숫자가 있으면 10으로 나눈 몫이 0이 아님

class Solution {
    public int solution(int i, int j, int k) {
        int answer = 0;

        // 1.
        for (int num = i; num <= j ; num++) {

	// 2.
            int tmp = num;

	// 5.
            while(tmp != 0) {

		// 3.
                if (tmp % 10 == k) answer++;
                
		// 4.
                tmp /= 10;
            }
        }
            
        return answer;
    }
}

나의 풀이(2)

  1. 주어진 숫자를 하나씩 돌면서 비교
  2. 해당 숫자(int)를 String으로 변환
  3. 변환한 문자열을 한 글자씩 돌면서 비교

    3-1. intkchar(k_char)로 형변환

    3-2. 해당 문자열에 k_char가 존재하는 수만큼 answer 증가

class Solution {
    public int solution(int i, int j, int k) {
        int answer = 0;
        
	// 1.
        for (int a = i; a <= j; a++) {

	    // 2.
            String num = String.valueOf(a);
            
	// 3.
            for (int b = 0; b < num.length(); b++) {

		// 3-1.
                char k_char = (char)(k + '0');
                
		// 3-2.
                if (num.charAt(b) == k_char) answer++;
            }
        }
}