티스토리 뷰
728x90
반응형
문제 요약
- 알고리즘 분류: DFS, 백트래킹
- 난이도: Medium
- 문제내용:
- n까지 숫자를 사전순으로 정렬 하여라.
- 사이트 주소: https://leetcode.com/problems/lexicographical-numbers/description/
문제풀이
이번 문제는 숫자를 사전 순으로 정렬 하는것이다. 1, 2, 3 순이 아니라 1, 10, 100순으로 앞자리가 낮은 순으로 정렬 하는것이다. 이 문제는 깊이 우선 탐색, 백트레킹으로 해결하면된다. 깊이 우선 탐색, 백트레킹 자세한것은 아래 글에서 확인 해보면 된다.
- 백트레킹: https://jih3508.tistory.com/84
- 깊이 우선 탐색: https://jih3508.tistory.com/94
문제 접근방법
0 ~ 9 반복문으로 백트레킹 탐색 하면된다. 구현은 아래 같이 하면된다.
- 1 ~ 9순으로 dfs 탐색을 한다.
- 현재 숫자가 n보다 크면 탐색 종료한다.
- 1번 경우 아니면 현재 숫자를 리스트에 추가한다.
- 반복문 0 ~ 9 반복문 i로 돌리다.
- 현재숫자에서 × 10을 한 뒤 i 더하고 n보다 작으면 다음 백트레킹 탐색 한다.
dfs관련 아래 같이 작성하면 된다.
DFS 코드
Python
def dfs(currentNum):
# n보다 클경우 현제 숫자 종료
if currentNum > n:
return
result.append(currentNum) # n이하일 경우 추가 한다.
for i in range(10):
nextNum = currentNum * 10 + i # 다음수는 10을 곱하고 i를 더한다.
# 다음 수가 N보다 클경우 종료
if nextNum > n:
break
# n이하일 경우 다음 dfs 탐색
dfs(nextNum)
Java
public void dfs(int currentNum) {
if(currentNum > this.n) {
return;
}
this.result.add(currentNum);
for(int i = 0; i <= 9; i++) {
int nextNum = currentNum * 10 + i;
if(nextNum > n) {
break;
}
dfs(nextNum);
}
}
O(n)만큼 시간 복잡도 나온다, 전체 코드는 아래 확인 해보면된다.
Code
Python
class Solution:
def lexicalOrder(self, n: int) -> list[int]:
result = []
def dfs(currentNum):
# n보다 클경우 현제 숫자 종료
if currentNum > n:
return
result.append(currentNum) # n이하일 경우 추가 한다.
for i in range(10):
nextNum = currentNum * 10 + i # 다음수는 10을 곱하고 i를 더한다.
# 다음 수가 N보다 클경우 종료
if nextNum > n:
break
# n이하일 경우 다음 dfs 탐색
dfs(nextNum)
# 1부터 9까지 순서대로 탐색한다.
for i in range(1, 10):
dfs(i)
return result
Java
class Solution {
List<Integer> result;
int n;
public List<Integer> lexicalOrder(int n) {
this.result = new ArrayList<Integer>();
this.n = n;
for(int i = 1; i <= 9; i++) {
dfs(i);
}
return this.result;
}
public void dfs(int currentNum) {
if(currentNum > this.n) {
return;
}
this.result.add(currentNum);
for(int i = 0; i <= 9; i++) {
int nextNum = currentNum * 10 + i;
if(nextNum > n) {
break;
}
dfs(nextNum);
}
}
}
728x90
반응형
'알고리즘 > Leetcode' 카테고리의 다른 글
[Leetcode] 221. Maximal Square (0) | 2024.05.13 |
---|---|
[Leetcode] 1302. Deepest Leaves Sum (1) | 2024.04.19 |
[Leetcode] 91. Decode Ways (1) | 2024.04.05 |
[Leetcode] 207. Course Schedule (0) | 2024.03.22 |
[Leetcode] 1689. Partitioning Into Minimum Number Of Deci-Binary Numbers (1) | 2024.03.21 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 그래프
- 수학
- 알고리즘
- 배열
- LeetCode
- BaekJoon
- level2
- spring-boot
- BFS
- 조합
- 재귀호출
- 넓이 우선 탐색
- Greedy
- 백트레킹
- 동적 계획법
- 파이썬
- java
- 자바
- DP
- 이론
- 문자열
- 그리디
- 동적계획법
- 구현
- Programmerse
- JSCODE
- Python
- 누적합
- DFS
- 백준
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함