[프로그래머스] Lv.0 - 숫자 찾기
안녕하세요.
오늘은 프로그래머스의 코딩테스트 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를 비교하며 일치하는 경우 해당 인덱스를 저장하고 찾는 순간 반복문을 종료하여 결과를 반환하도록 구현하였습니다.
- num을 문자열로 변환.
- 문자열 길이만큼의 정수 배열 선언.
- 반복문을 통해 각 문자를 정수로 변환하여 배열에 저장.
- 다시 반복문을 통해 배열 요소가 k와 일치하는지 확인.
- 일치하는 경우 i + 1을 결과값으로 저장하고 break.
- 결과값 반환. (없으면 -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의 내장 메서드를 활용한 간결한 방법이 있어 함께 정리해보았습니다.
첫번째는 수학적 연산을 활용한 풀이법입니다.
- num % 10을 통해 마지막 자릿수를 추출하고 num / 10을 통해 자릿수를 줄여가며 0이 될때까지 반복합니다.
- 자릿수를 뒤에서부터 탐색하기 때문에 원하는 값을 찾으면 해당 위치를 count로 저장해둡니다.
- 반복이 끝난 후, 전체 자릿수에서 뒤에서부터 자릿수를 빼면 앞에서의 위치를 구할 수 있습니다.
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을 문자열로 변환하지 않고 나머지(%)와 나눗셈(/)을 이용하여 각 자릿수를 뒤에서부터 하나씩 확인하는 방식입니다.
문자열 변환 없이 숫자 자체로 처리하므로 메모리 측면에서 유리할 수 있습니다.
두번째는 내장 함수를 활용한 풀이법입니다.
- String.valueOf()를 이용해 k를 문자열로 변환합니다.
- 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 - 숫자 찾기 문제 풀이를 마치겠습니다.
감사합니다.