Coding Test/Programmers

[Lv.0] k의 개수 [프로그래머스_코딩테스트] [구현, 수학] [10분]

whawoo 2025. 7. 4. 00:30
반응형

🔍 문제 요약

https://school.programmers.co.kr/learn/courses/30/lessons/120887

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

숫자 i에서 j까지 하나씩 돌면서 k가 숫자에 들어간 개수를 더한 값을 반환하는 문제

🧠 나의 접근 방식과 시행착오

4분 걸린 문제. 일단 한 숫자에 k가 포함된 count를 계산하는 함수를 따로 빼서 정리하였다. (보통 하나의 함수 안에서 처리를 하려고 하면 코드가 정리가 안되거나 실수가 나오기 쉬워서 이런 문제의 유형에서는 자주 활용하는 편) 그 이후에는 그저 i부터 j까지 돌면서 더하기만 해주면 된다.

/// <summary>
/// k의 개수
/// https://school.programmers.co.kr/learn/courses/30/lessons/120887
/// </summary>
public int solution(int i, int j, int k)
{
    int sumCount = 0;

    for (int t = i; t <= j; t++)
    {
        sumCount += GetCount(t, k);
    }

    return sumCount;
}

public int GetCount(int num, int t)
{
    const int MulNum = 10;
    int count = 0;

    while (num > 0)
    {
        if (num % MulNum == t)
        {
            count++;
        }

        num /= MulNum;
    }

    return count;
}

✅ 풀이 코드

피드백으로 나온 점은 굳이 상수를 선언해서까지 할 필요는 없다는 점과 함수의 이름이 좀더 의도를 알 수 있는 CountDigitOccurence와 같은 이름으로 바꾸거나 하는 것이다. 추가로 숫자를 스트링으로 바꾼 후 Linq의 Count를 써서 해결을 하는 방법도 있으나 문자열 변환 비용 등을 고려하면 별로 좋아 보이진 않음.

public int solution(int i, int j, int k)
{
    int count = 0;
    for (int n = i; n <= j; n++)
    {
        count += n.ToString().Count(c => c == k.ToString()[0]);
    }
    return count;
}

🔄 정리

함수를 따로 분리한다는 점이 해당 문제에서는 생각할 점이라는 생각이 든다. 그리고 뭔가 반복적으로 연산이 일어나는 부분이 있긴 할건데 이 부분을 좀 더 개선할 수도 있을까란 생각은 든다. 다만 뭐 레벨 0인 문제라 그 정도까지 생각은 애매한 듯도..

반응형