문제 설명
자연수 n
이 주어졌을 때, 이 숫자를 뒤집어 각 자리 숫자를 배열의 원소로 가지는 배열을 반환하는 문제입니다. 예를 들어 n = 12345
라면, 배열 [5, 4, 3, 2, 1]
을 반환해야 합니다.
제한 조건
n
은 10,000,000,000 이하인 자연수입니다.
입출력 예
n | return |
---|---|
12345 | [5, 4, 3, 2, 1] |
문제 풀이
이 문제는 주어진 자연수를 뒤집어 각 자릿수를 분리해 배열로 만드는 문제입니다. 이를 해결하기 위한 두 가지 접근 방법은 문자열로 변환하여 처리하거나, 수학적 계산을 이용하는 방식입니다.
1. Python 코드 풀이
방법 1: 문자열 변환 후 리스트로 변환
def solution(n):
return [int(digit) for digit in str(n)[::-1]]
# 테스트 예시
print(solution(12345)) # 출력: [5, 4, 3, 2, 1]
코드 설명
str(n)
을 사용하여 숫자n
을 문자열로 변환합니다.- 문자열을
[::-1]
로 뒤집습니다. - 리스트 컴프리헨션을 통해 각 문자를
int
로 변환하여 배열로 반환합니다.
방법 2: 수학적 접근 (나머지 연산 사용)
def solution(n):
result = []
while n > 0:
result.append(n % 10) # n의 마지막 자릿수를 추가
n //= 10 # n을 10으로 나눠서 마지막 자릿수 제거
return result
# 테스트 예시
print(solution(12345)) # 출력: [5, 4, 3, 2, 1]
코드 설명
- 빈 리스트
result
를 생성합니다. n
이 0이 될 때까지 반복문을 돌면서n % 10
을 사용하여 마지막 자릿수를 구해 리스트에 추가합니다.n //= 10
을 통해n
을 10으로 나눠 마지막 자릿수를 제거합니다.- 모든 자릿수를 처리한 후, 리스트
result
를 반환합니다.
2. Java 코드 풀이
방법 1: 문자열을 이용한 풀이
import java.util.ArrayList;
import java.util.List;
class Solution {
public int[] solution(long n) {
String str = Long.toString(n); // 숫자를 문자열로 변환
int[] result = new int[str.length()]; // 결과 배열 선언
// 문자열을 거꾸로 순회하며 결과 배열에 저장
for (int i = 0; i < str.length(); i++) {
result[i] = str.charAt(str.length() - 1 - i) - '0';
}
return result;
}
public static void main(String[] args) {
Solution sol = new Solution();
int[] result = sol.solution(12345L);
for (int num : result) {
System.out.print(num + " ");
}
}
}
코드 설명
Long.toString(n)
을 사용해n
을 문자열로 변환합니다.- 문자열의 길이만큼
int
배열을 선언합니다. - 문자열을 뒤에서부터 순회하면서 각 문자를 숫자로 변환한 후 배열에 저장합니다.
- 최종적으로 결과 배열을 반환합니다.
방법 2: 수학적 접근
import java.util.ArrayList;
class Solution {
public int[] solution(long n) {
ArrayList<Integer> list = new ArrayList<>();
// n이 0보다 클 때까지 반복
while (n > 0) {
list.add((int) (n % 10)); // 마지막 자릿수를 리스트에 추가
n /= 10; // n을 10으로 나눠서 자릿수를 줄임
}
// 리스트를 배열로 변환하여 반환
return list.stream().mapToInt(i -> i).toArray();
}
public static void main(String[] args) {
Solution sol = new Solution();
int[] result = sol.solution(12345L);
for (int num : result) {
System.out.print(num + " ");
}
}
}
코드 설명
ArrayList
를 생성하여 각 자릿수를 저장합니다.n % 10
으로 마지막 자릿수를 구해 리스트에 추가하고,n /= 10
으로 자릿수를 제거합니다.- 리스트에 저장된 값을 배열로 변환한 후 반환합니다.
3. 시간 복잡도 분석
- 시간 복잡도: 입력된 숫자의 자릿수를
d
라고 했을 때, 숫자의 각 자릿수를 처리하므로 O(d)입니다.n
이 최대 10,000,000,000이라면 최대 10자리 숫자이므로, 10회 반복됩니다.
결론
이 문제는 숫자를 문자열로 변환하여 쉽게 풀 수 있으며, 수학적인 방법을 사용해서도 해결할 수 있습니다. Python과 Java 모두에서 각각의 방식으로 효율적으로 처리할 수 있으며, 시간 복잡도는 숫자의 자릿수에 비례하여 O(d)입니다.
'여러가지 > 알고리즘 & 자료구조' 카테고리의 다른 글
[프로그래머스] 정수 제곱근 판별 (1) | 2024.10.14 |
---|---|
[프로그래머스] 정수 내림차순으로 배치하기 (0) | 2024.10.14 |
[프로그래머스] 문자열 내 p와 y의 개수 (1) | 2024.10.14 |
[프로그래머스] 약수의 합 (0) | 2024.10.13 |
[프로그래머스] 자릿수 더하기 (0) | 2024.10.13 |