프로그래머스/Lv. 0(코딩테스트 입문)

[프로그래머스 코딩테스트] 숫자 찾기(Java)

Sigfriede 2023. 4. 10. 21:19

  문제 설명

  정수 num과 k가 매개변수로 주어질 때, num을 이루는 숫자 중에 k가 있으면 num의 그 숫자가 있는 자리 수를 return하고 없으면 -1을 return 하도록 solution 함수를 완성해보세요.

 

  제한사항

  • 0 < num < 1,000,000
  • 0 <= k < 10
  • num에 k가 여러 개 있으면 가장 처음 나타나는 자리를 return 합니다.

 

  입출력 예

num k result
29183 1 3
232443 4 4
123456 7 -1
class Solution {
    public int solution(int num, int k) {
        int answer = -1;
        int length = (int)(Math.log10(num) + 1);
        int count = 0;
        while (num > 0) {
            int digit = num % 10;
            count++;
            if (digit == k) {
                answer = length - count + 1;
            }
            num /= 10;
        }
        return answer;
    }
}

  num을 이루는 숫자 중 k가 없다면 -1을 반환해야 하므로, answer를 -1로 초기화했습니다. 숫자의 길이를 세는 length 변수를 만들어줍니다. 이를 위해 Math 클래스의 log 메소드를 이용했습니다. 만약 num이 10이라면 log10(10)의 값은 1이 됩니다. 그러나 10은 두 자리 수입니다. log10으로 구하는 숫자의 길이는 1씩 모자라므로, 1씩 더해줍니다.

  k가 몇 번째 자리에 있는지 확인할 count 변수를 생성해줍니다. while문으로 num이 0보다 클 때까지 계산을 반복합니다. 자릿수의 값은 각각 digit 변수에 할당합니다. 나누기 연산을 할 때마다 count가 1씩 증가합니다. 이러한 과정에서 만약 digit가 원하는 숫자 k와 같다면 answer에 답을 할당합니다. answer는 숫자의 길이에서 k를 만날 때까지 나누기 연산을 반복한 횟수를 뺀 값에서 1을 더한 값입니다. 1을 더해주는 이유는 인덱스를 맞춰주기 위함입니다.

  k의 위치가 두 개 이상일 때 주의해야 합니다. 만약 if문 끝에 break를 쓸 경우, 문제에서 원하는 첫번째 k의 위치가 아닌, 마지막 k의 위치가 나타나게 됩니다. while문은 일의 자리(역순)에서부터 계산하기 때문입니다. break가 있을 때, 일의 자리에서부터 큰 자리로 점차 이동하면서 계산을 진행하다가, k를 발견하면 즉시 for문을 빠져나올 것입니다. 만약 마지막 k의 위치를 구하고 싶은 것이라면 상관 없지만, 그게 아니라면 break를 쓰지 않아야 뒤에서 k를 발견하더라도 for문을 빠져나가지 않고 마지막까지 순회하면서 k의 위치를 구할 것입니다.