[프로그래머스] 큰 수 만들기 - Python (Greedy)

2023. 3. 22. 14:16·Algorithm (PS)
728x90

https://school.programmers.co.kr/learn/courses/30/lessons/42883

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

greedy 라길래 처음엔 단순하게 작은 숫자들 차례대로 구해서 전체 숫자에서 지워주는 방식으로 갔다 

그런데 이 방식은 test case 3에서 걸린다.. 

"4177252841" 의 경우 가장 작은 숫자들 k 개 고르면 1, 1, 2, 2 인데 이걸 linear 하게 지우면 얻는 값이 477584 가 나오게 된다. 

but 실제로는 775841이 만들 수 있는 가장 큰 수라는 반례가 생긴다. (Greedy는 반례가 없는지 고려해봐야 한다는게 어렵당~~ ) 

이런 반례가 생기는 이유는, 선형적으로 탐색했기 때문에 생기는 것이고 이를 해결하기 위해서는 전체 숫자에서 지금 만드는 값이 최댓값인지 확인해주어야 한다.

이를 위해 stack 구조를 활용해야 한다!!

주요 로직은 제거할 숫자가 아직 k개 남았다면, stack 에서 가장 위에 있는 숫자가 현재 number에서 확인하고 있는 숫자보다 크거나 같을 때까지 pop() 하면서 k의 개수를 1개씩 줄여주는 것이다. 

1 9 2 4 가 있다면 

stack = [1] , k = 2

stack = [9] , k = 1 (제거한 숫자 : 1)

stack = [9, 2] , k = 1 (제거한 숫자 : 1)
9 > 2 이므로 2는 그대로 push 한다. 

stack = [9, 4] , k = 0 (제거한 숫자: 1, 2)
2 < 4 이고 아직 k > 0 이므로 2는 pop 한다. 9 > 4 이므로 비교 종류하고 4를 스택에 push한다. 

1, 9, 2, 4, 처리를 모두 해주었으므로 현재 stack에 남아있는 숫자를 문자열로 만들어 버리면 94가 된다. 

def solution(number, k):
    answer = ''
    arr = [int(i) for i in number]
    stack = []
    n = len(number)
    for i in range(n):
        if not stack:
            stack.append(number[i])
            continue 

        # 현재 숫자보다 stack 맨 위의 숫자가 같거나 클때까지 pop
        while k > 0 and stack and stack[-1] < number[i]:
            stack.pop() # 숫자 제거 
            k -= 1 

        stack.append(number[i])
                
    answer = ''.join(stack)
    return answer

 

728x90

'Algorithm (PS)' 카테고리의 다른 글

[프로그래머스] 구명보트 Python  (0) 2023.03.25
[백준] 2573번 빙산 (Python)  (0) 2023.03.23
[백준] 17394 핑거 스냅 (Python)  (0) 2023.03.22
에라토스테네스의 체 (소수판별 알고리즘) Python  (0) 2023.03.22
[백준] 16197번: 두 동전 python (백트래킹/dfs)  (0) 2023.03.20
'Algorithm (PS)' 카테고리의 다른 글
  • [프로그래머스] 구명보트 Python
  • [백준] 2573번 빙산 (Python)
  • [백준] 17394 핑거 스냅 (Python)
  • 에라토스테네스의 체 (소수판별 알고리즘) Python
minjiwoo
minjiwoo
Data Engineering과 Cloud Native 기술에 대해 Dive Deep 하는 플랫폼 엔지니어가 되는 것을 목표로 하고 있습니다. 경험과 공부한 내용을 기록하며 지속가능한 엔지니어가 되는 것이 꿈입니다.
minji's engineering noteData Engineering과 Cloud Native 기술에 대해 Dive Deep 하는 플랫폼 엔지니어가 되는 것을 목표로 하고 있습니다. 경험과 공부한 내용을 기록하며 지속가능한 엔지니어가 되는 것이 꿈입니다.
minjiwoo
minji's engineering note
minjiwoo
전체
오늘
어제
  • 분류 전체보기 (613)
    • Data Engineering (42)
      • Apache Spark (11)
      • Databricks & Delta Lake (9)
      • Airflow (3)
      • SQL (6)
      • Trouble Shooting (2)
      • Hadoop (2)
      • MLOps (1)
    • Cloud Engineering (104)
      • AWS (23)
      • Linux 🐧 (29)
      • Docker 🐳 (21)
      • Kubernetes ⚙️ (20)
      • Ansible (10)
    • Computer Science (87)
      • 네트워크 (9)
      • 운영체제 (25)
      • 정보처리기사 (48)
      • CS 기술 면접 스터디 (3)
    • Programming Languages (27)
      • Python (17)
      • C와 C++ (10)
    • Backend (5)
      • Django (2)
    • 프로젝트 (2)
      • 테크포임팩트 (2)
    • iOS (11)
      • 레이블러리 (2)
    • Algorithm (PS) (275)
      • LeetCode (6)
    • 개발일기 (30)
      • 내돈내산 후기🎮 (3)
      • 개발자 취준생 (5)
      • Today I Learned (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Hi there

인기 글

태그

  • 빅데이터
  • python
  • 코딩테스트
  • 쿠버네티스
  • EC2
  • docker
  • linux
  • 스파크
  • Kubernetes
  • 데이터엔지니어링
  • 리눅스
  • dp
  • 클라우드
  • 백트래킹
  • 데이터엔지니어
  • SPARK
  • AWS
  • Swift
  • Leetcode
  • 파이썬
  • 운영체제
  • 백준
  • 프로그래머스
  • 카카오코딩테스트
  • dfs
  • ansible
  • BFS
  • 데이터브릭스
  • 알고리즘
  • Databricks

최근 댓글

최근 글

hELLO· Designed By정상우.v4.5.2
minjiwoo
[프로그래머스] 큰 수 만들기 - Python (Greedy)
상단으로

티스토리툴바

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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