티스토리 뷰

알고리즘/Leetcode

[Leetcode] 386. Lexicographical Numbers

응애~ 개발자 2024. 4. 18. 04:39
728x90
반응형

문제 요약

문제풀이 

 이번 문제는 숫자를  사전 순으로 정렬 하는것이다. 1, 2, 3 순이 아니라 1, 10, 100순으로 앞자리가 낮은 순으로 정렬 하는것이다. 이 문제는 깊이 우선 탐색, 백트레킹으로 해결하면된다. 깊이 우선 탐색, 백트레킹 자세한것은 아래 글에서 확인 해보면 된다.

 

[알고리즘 이론] 깊이 우선 탐색(DFS)

이론 이번에 볼 자료구조는 깊이 우선 탐색(DFS)이다. 깊이 우선 탐색은 영어로 Depth First Search이고 줄어서 DFS라고 많이 부른다. 그래프 탐색 알고리즘 중 하나인데 그래프 말고도 트리에서도 적용

jih3508.tistory.com

 

문제 접근방법

  0 ~ 9 반복문으로 백트레킹 탐색 하면된다. 구현은 아래 같이 하면된다.

  1. 1 ~ 9순으로 dfs 탐색을 한다. 
  2. 현재 숫자가 n보다 크면 탐색 종료한다.
  3. 1번 경우 아니면 현재 숫자를 리스트에 추가한다.
  4. 반복문 0 ~ 9 반복문 i로 돌리다.
  5.  현재숫자에서 × 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
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
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
글 보관함