알고리즘/프로그래머스

[프로그래머스] Lv.0 - 숫자 찾기

으노로 2025. 5. 15. 01:25

안녕하세요.

오늘은 프로그래머스의 코딩테스트 lv.0단계 중에 숫자 찾기를 공부해보겠습니다.

언어는 Java로 구현하였습니다.

 

문제 설명

정수 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

문제 풀이

매개변수 num에 매개변수 k가 포함되어 있는지 확인하기 위해 먼저 num을 문자열로 변환하였습니다.
문자열로 변환한 뒤 자릿수를 확인하고 해당 자릿수만큼의 배열을 선언하여 각 자릿수를 배열에 하나씩 저장하였습니다.
이후 반복문을 통해 배열의 각 자리와 k를 비교하며 일치하는 경우 해당 인덱스를 저장하고 찾는 순간 반복문을 종료하여 결과를 반환하도록 구현하였습니다.

  1. num을 문자열로 변환.
  2. 문자열 길이만큼의 정수 배열 선언.
  3. 반복문을 통해 각 문자를 정수로 변환하여 배열에 저장.
  4. 다시 반복문을 통해 배열 요소가 k와 일치하는지 확인.
  5. 일치하는 경우 i + 1을 결과값으로 저장하고 break.
  6. 결과값 반환. (없으면 -1)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
    public int solution(int num, int k) {
        int answer = -1;
        
        String str = String.valueOf(num);
 
        int[] arr = new int[str.length()];
 
        for(int i = 0; i < str.length(); i++) {
            arr[i] = str.charAt(i) - '0';
        }
        
        for(int i = 0; i < arr.length; i++) {
            if(arr[i] == k) {
                answer = i + 1;
                
                break;
            }
        }
        
        return answer;
    }
}

 

추가 풀이

이번에는 배열을 사용하지 않고 수학적 연산을 활용한 방식으로 문제를 해결해보았습니다.
또한 다른 분들의 풀이 중에 Java의 내장 메서드를 활용한 간결한 방법이 있어 함께 정리해보았습니다.

 

첫번째는 수학적 연산을 활용한 풀이법입니다.

  1. num % 10을 통해 마지막 자릿수를 추출하고 num / 10을 통해 자릿수를 줄여가며 0이 될때까지 반복합니다.
  2. 자릿수를 뒤에서부터 탐색하기 때문에 원하는 값을 찾으면 해당 위치를 count로 저장해둡니다.
  3. 반복이 끝난 후, 전체 자릿수에서 뒤에서부터 자릿수를 빼면 앞에서의 위치를 구할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
    public int solution(int num, int k) {
        int answer = -1;
        int count = 0;
        
        while(num != 0) {
            if((num % 10== k) {
                answer = count;
            }
            
            num = num / 10;
            count++;
        }
        
        if(answer != -1) {
            answer = count - answer;
        }
        
        return answer;
    }
}

이 풀이는 num을 문자열로 변환하지 않고 나머지(%)와 나눗셈(/)을 이용하여 각 자릿수를 뒤에서부터 하나씩 확인하는 방식입니다.

문자열 변환 없이 숫자 자체로 처리하므로 메모리 측면에서 유리할 수 있습니다.

 

두번째는 내장 함수를 활용한 풀이법입니다.

  1. String.valueOf()를 이용해 k를 문자열로 변환합니다.
  2. indexOf()를 활용해 num의 앞에 "-"를 추가한 값에 k가 처음 등장하는 인덱스를 찾습니다.
1
2
3
4
5
class Solution {
    public int solution(int num, int k) {
        return ("-" + num).indexOf(String.valueOf(k));
    }
}

이 풀이는 Java의 내장함수인 indexOf()와 valueOf()를 사용하여 문제를 해결한 방식으로 짧고 간단하며 문자열 처리에 익숙한 경우 유용하게 활용할 수 있습니다.

" - "와 같은 더미 문자를 앞에 붙여주는 이유는, indexOf()가 0부터 시작하므로 k가 존재하지 않을 때 -1을 반환하는 동작을 유지하면서도 index 값을 1부터 셀 수 있도록 하기 위함입니다.


사용 함수

  • String.valueOf()
    • 정수를 문자열로 변환합니다.
  • charAt(i)
    • 문자열에서 특정 위치의 문자를 가져옵니다.
  • String.indexOf()
    • 문자열 내에서 특정 문자열이 처음 등장하는 위치(index)를 반환합니다.

마무리 정리

이번 문제는 문자열과 배열로 변환과 반복문을 활용해 비교적 간단하게 해결할 수 있었습니다.

또한 수학적 연산이나 내장 함수를 활용하면 메모리 효율성과 코드 가독성 측면에서 더 나은 코드 작성이 가능하다는 점을 느꼈습니다.

이상으로 프로그래머스 Lv.0 - 숫자 찾기 문제 풀이를 마치겠습니다.

감사합니다.