코딩테스트 연습/프로그래머스 LV.0

[프로그래머스] Lv.0 k의 개수 - 자바(Java)

5ein 2024. 4. 11. 17:51

문제: 코딩테스트 연습 - k의 개수 | 프로그래머스 스쿨 (programmers.co.kr)

문제설명

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

입출력 예

i j k result
1 13 1 6
10 50 5 5
3 10 2 0

나의 문제 풀이

방법1과 방법2는 사실 똑같은 풀이인데 int를 String으로 어떻게 바꾸는가의 차이이다!

// 방법1 (+ "" 로 String타입으로 변경)
class Solution {
    public int solution(int i, int j, int k) {
    	int answer = 0;
    	String S = k + "";
    	for (int l = i; l <= j; l++) {
            String[] s = (l + "").split("");
            for (int m = 0; m < s.length; m++) {
                if(s[m].equals(S)) {
                    answer++;
                }
            }
        }
    	return answer;
    }

// 방법2 (String.valueof() 로 String타입으로 변경)
class Solution {
    public int solution(int i, int j, int k) {
        int answer = 0;
        String strK = String.valueOf(k);
        for (int l = i; l <= j; l++) {
            String s[] = String.valueOf(l).split("");
            for (int m = 0; m < s.length; m++) {
                if(s[m].equals(strK)) answer++;
            }
        }
        return answer;
    }
}

다른 사람의 문제풀이

//다른사람 풀이 1 (문자열 반복)
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();
    }
}

//다른사람 풀이 2 (while문 사용)
class Solution {
    public int solution(int i, int j, int k) {
        int answer = 0;

        for (int num = i; num <= j; num++){
            int tmp = num;
            while (tmp != 0){
                if (tmp % 10 == k)
                    answer++;
                tmp /= 10;
            }
        }
        return answer;
    }
}

느낀점

나는 String배열에서 이중for문 사용하는 방법 밖에 생각이 안나던데,, 다른사람의 풀이가 너무 간결해서 놀랐다..

특히 다른사람 풀이1은 새로웠다.. 어떤 분이 댓글에 문자열 반복문은 성능이 좋지 않다고 하셨다..

궁금해서 프로그래머스에서 다시 테스트를 해보았다.

다른사람 풀이1 실행
다른사람 풀이1 실행
+ &quot;&quot; 실행
+ "" 실행
String.valueOf() 실행
String.valueOf() 실행

 

이렇게 결과를 비교하는게 맞는지는 모르겠지만 다른사람 풀이1인 문자열반복 이용방법이 확실히  오래걸렸다고 나왔다!

이렇게 보니 더 재미있고 흥미로워 졌다!!


문제 출처: 코딩테스트 연습 | 프로그래머스 스쿨 (programmers.co.kr)