Programmers/Lv2

[프로그래머스] 큰 수 만들기 (Lv2) / 그리디, stack 활용

2023. 6. 17. 10:59

문제요약

나의 코드 및 설명 (백트래킹) - 당연히 시간초과..

  • number의 각 자리를 방문하면서 temp_list 라는 임시 테이블에 담는다. 
    temp_list의 길이가 len(num_list)-k 가 된다면, result 리스트에 숫자로 변환한 값을 저장한다.
  • result에 저장된 값중 가장 큰 값을 문자열 형태로 변환 후 출력한다.
v = []

def solution(number, k):
    answer = ''
    num_list = list(map(int, str(number)))
    result = []
    
    def dfs(count, start, temp_list):
        if len(temp_list) == len(num_list) - k:
            result.append(int("".join(map(str, temp_list))))
            return
        if count == len(num_list) - k:
            return
        for i in range(start, len(num_list)):
            if i not in v:
                v.append(i)
                dfs(count+1, i+1, temp_list+[num_list[i]])
                v.pop()
            
    dfs(0,0,[])
    answer = str(max(result))
    
    return answer

다른 코드 및 설명 (스택 활용)

  • 숫자를 넣을 stack 리스트를 생성한다.
  • number의 각 자리를 방문하면서, 
    만약 stack 안에 무언가라도 존재하고, k의 값이 1 이상(남아있는 제거 할수 있는 횟수가 1이상)이고, 방문한 number의 자리가 stack에 저장된 마지막 값보다 크다면, stack에 저장된 마지막 값을 제거하고, k의 값을 1만큼 감소시킨다.
  • 무조건 stack에 방문한 number의 자리를 저장한다.
  • answer = "".join(map(str, stack[:len(number)-k])) :
    예를들어 number = "987654321", k=4 일 경우, 정답으로 출력되어야 할 값은 "98765"일 것이다.
    number의 각 자리의 숫자들은 내림차순이고, 이 경우에는 while문의 수행 조건에 해당하지 않기 때문에, stack에 저장된 값이 pop()되거나, k의 값이 감소되지 않는다.
    따라서, stack[:len(number)-k] 를 통해 k>0일 때를 대비해서 스택을 잘라준다. 
def solution(number, k):
    answer = ''
    stack = []
    for i in number:
        while stack and k>0 and i>stack[-1]:
            stack.pop()
            k-=1
        stack.append(i)
    answer = "".join(map(str, stack[:len(number)-k]))
            
    return answer

피드백

제한 조건에 number의 범위가 최대 백만자리이므로 백트래킹으로 구현하면 당연히 시간초과가 발생할 것을 알고 있었다.. 
처음엔 스택으로 풀어보려다가 어떻게 구현해야할지 막막했고, 실패했다. 여러 번 시도 끝에 구현에 실패하느니 백트래킹 풀고 몇 개의 테스트케이스라도 맞자라는 생각으로 백트래킹으로 풀었다. 예제 테스트케이스는 모두 맞았으나 역시나 나머지 테스트케이스에서는 시간초과가 발생했다.

스택을 활용한 문제풀이를 보고 경악했다.. 어떻게 이 문제를 이렇게 간단하게 구현할 수 있을까 많이 좌절했다. 백준 문제를 많이 풀면서 스택을 활용하는 것도 연습 했었기 때문에, 간단히 스택을 활용하는 것은 자신있었는데 새로운 배움을 맞이한 느낌이었다. 
여러 번 코드를 분석한 끝에 코드를 이해할 수 있었고, 잘 흡수해서 내 것으로 만들어야겠다.

 

'Programmers > Lv2' 카테고리의 다른 글

[프로그래머스/JS] 귤 고르기 (Lv2)  (0) 2023.08.04
[프로그래머스/JS] N개의 최소 공배수 (Lv2) / 유클리드 호제법  (0) 2023.08.04
[프로그래머스/JS] 멀리 뛰기 (Lv2) / DP  (0) 2023.08.04
[프로그래머스/JS] JadenCase 문자열 만들기 (Lv2)  (0) 2023.08.04
[프로그래머스/JS] 올바른 괄호 (Lv2)  (0) 2023.08.04
'Programmers/Lv2' 카테고리의 다른 글
  • [프로그래머스/JS] N개의 최소 공배수 (Lv2) / 유클리드 호제법
  • [프로그래머스/JS] 멀리 뛰기 (Lv2) / DP
  • [프로그래머스/JS] JadenCase 문자열 만들기 (Lv2)
  • [프로그래머스/JS] 올바른 괄호 (Lv2)
hellosonic
hellosonic
hellosonic
꾸준함
hellosonic
전체
오늘
어제
  • 분류 전체보기 (285)
    • SSAFY (4)
    • 프로그래머스 데브코스 (26)
    • Diary (1)
    • JavaScript (20)
    • ToyPJ (13)
      • Python-Django (13)
    • CS지식 (11)
      • 자료구조 (5)
      • 개발 상식 (2)
      • 네트워크 (4)
    • Baekjoon (141)
      • IM Level (57)
      • DFS와 BFS (21)
      • 백트래킹 (21)
      • DP (3)
      • 이분탐색 (4)
      • 구현 (14)
    • Programmers (13)
      • Lv1 (4)
      • Lv2 (9)
    • SWEA (SW Expert Academy) (52)
      • D1 (5)
      • D2 (7)
      • D3 (40)
    • 이코테 (4)
    • Grammar (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 글쓰기
  • 관리자

공지사항

인기 글

태그

  • 자바스크립트 기본기
  • 백준 1157
  • 리액트 todolist
  • JS
  • SWEA/D3
  • 파이썬 2529
  • SWEA D3
  • 자바스크립트
  • 파이썬 11478
  • SWEA 파이썬
  • SWEA
  • 백준
  • 프로그래머스 데브코스
  • 파이썬 1436
  • 코딩부트캠프
  • 이코테
  • 백준 5212
  • 그리디
  • 파이썬
  • 프론트엔드 데브코스
  • SWEA D2
  • 국비지원교육
  • javascript ux
  • 백준 14891
  • 구현
  • 백준 18870
  • 파이썬 1269
  • 파이썬 1946
  • 백준 2999
  • 프로그래머스

최근 댓글

최근 글

hELLO · Designed By 정상우.
hellosonic
[프로그래머스] 큰 수 만들기 (Lv2) / 그리디, stack 활용
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.