파이썬 알고리즘 032 | 가장 큰 수 (스택)

Yunny.Log ·2021년 1월 12일
0

Algorithm

목록 보기
32/318
post-thumbnail

32. 가장 큰 수

선생님은 현수에게 숫자 하나를 주고, 해당 숫자의 자릿수들 중 m개의 숫자를 제거하
여 가장 큰 수를 만들라고 했습니다. 여러분이 현수를 도와주세요.(단 숫자의 순서는
유지해야 합니다)
만약 5276823 이 주어지고 3개의 자릿수를 제거한다면
7823이 가장 큰 숫자가 됩니다.
▣ 입력설명
첫째 줄에 숫자(길이는 1000을 넘지 않습니다)와 제거해야할 자릿수의 개수가 주어집니다.
▣ 출력설명
가장 큰 수를 출력합니다.
▣ 입력예제 1
5276823 3
▣ 출력예제 1
7823
▣ 입력예제 2
9977252641 5
▣ 출력예제 2
99776

<내 풀이>

스택 첫시간이라서 강의를 들어서 우선 접근법을 배운다

<풀이>

  • 나보다 작은 것은 앞에 있으면 안된다 ,앞에 애들 중 자기보다 작은 애들은 다 지워주기
num, m=(map(int,input().split()))
num=list(map(int, str(num)))
#n자리의 숫자였던 것을 string처리해주면 하나하나를
#잘라서 볼 수 있다. 꼭 str(num) 처리 해줘야 한다
#print(a) 하면 [5, 2, 7, 8, 6, 2, 3] 이렇게 저장이 된다

stack = []
for x in num :
    while stack and m>0 and stack[-1] < x : 
    #나보다 작은놈이라면
    #while stack : stack이란 리스트가 비어있으면 거짓이 되는 것 
    #m이 0이상이어야 지울 게 남아있는거
        stack.pop()
        m-=1
    stack.append(x) 
if m != 0 :
    stack=stack[:-m] #-m자료 딱 이전까지만 출력하는 것이다, 뒤쪽의 m개 자료 날리기
#for 돌면서 찍어도 되고
res=''.join(map(str, stack)) #스택이 지금 정수화 돼있으니깐 str화 해줘야 한다
print(res)

<반성점>

  • 신기한 발상이다. 아직은 낯설지만 계속 복습해나가면서 익숙해지도록 노력해야겠다

<배운 점>

  • 스택이라는 자료구조가 있다 (나중에 큐, 힙이란 것도 배울 예정)

  • 스택은 last in, first out이라는 구조이다

  • 스택은 운동장의 구덩이에 축구공이 빠지면 가장 나중에 빠진 축구공이 젤 먼저 빠지게 되는 구조와 같은 것

  • 파이썬은 리스트를 활용해서 스택을 구현하는 것이 가능하다

  • 없애버리는 것 pop()으로 구현

  • num은 5278623 인데 num=list(map(int, str(num)))
    로 처리해주면 (n자리의 숫자였던 것을 string처리해주면) 하나하나씩 잘려서 볼 수 있다. 꼭 str(num) 처리 해줘야 한다,
    print(a) 하면 [5, 2, 7, 8, 6, 2, 3] 이렇게 나온다

  • 내림차순으로 정렬되기 때문에 맨 뒤에를 제거하면 된다

  • s=[1,2,3,4,5] 일 때 s[:-2] 라고 하면 s[1, 2, 3]출력된다

파이썬으로 스택을 구현하는 방법
: 스택(Stack), 추출되는 데이터 : 가장 나중에 삽입된 데이터

  • 스택 지원하는 오퍼레이션 : pop & append
  • 스택 자료구조 초기화 할 때 빈 리스트 만들어주기

0개의 댓글