* 알고리즘 너무 약해서 기초 문제 50개 목표로 푸는 중...
* 3시간 안에 답을 내지 못하면 답지를 보고 30분 내로 정답 판정을 받고, 3일 뒤 다시 풀어보기
Greedy
8 / 50(NEW!)
탐색
7/ 50
기초 동적 프로그래밍
6 / 50
투포인터
2 / 10
이분탐색
0 / 10
문제
백준 2812번: 크게 만들기 or 프로그래머스 Level 2: 큰 수 만들기
→ solved.ac 기준 골드 3
→ 프로그래머스에서 연습 문제 중 Greedy에 있는 문제
문제 해결 아이디어
숫자에서 k를 뺀 나머지 만큼의 모든 경우의 수를 구하기에는 n의 최댓값이 1,000,000
→ Greedy로 최적의 알고리즘을 생각해내야 한다.
→ 가장 큰 수가 되기 위해서는
큰 수 위주로 뽑되, 출력 예시 중 "4177252841"(k = 4)와 같은 경우를 고려하자.
가장 작은 것은 1이지만, 정답에서 마지막 1은 없어지지 않는다.
큰 수 위주이되, 앞자리가 큰 수 인게 중요.
→ stack을 활용해서 큰 수만 담게 하자.
1. for문을 돌면서 number에 접근한다.
2. stack의 최상단이 현재 number보다 작으면 pop()한다.
3. stack에 값을 추가한다.
마지막으로 stack 에서 크기만큼 잘라서 업데이트 하면 끝.
구현
내 풀이
def solution(numbers, k):
stack = []
for n in numbers:
while stack and stack[-1] < n and k > 0:
stack.pop()
k -= 1
stack.append(n)
return ''.join(stack[:len(stack)-k])
메모
- 걸린 시간: 약 20분
- 첫 번째 풀었을 때 해답 못 찾고 답지 보고,
- 며칠 후 2차로 풀었을 때 20분 소요.
- 프로그래머스 test case 12에서 조금 소요가 됐다.
- 이는 반환 시에 stack에서 len(stack) - k만큼 잘라주지 않아서 그랬다.
- 처음에 프로그래머스에서 풀고, 다음에 백준에서 그대로 옮겨서 해봤는데 불통했다.
- 실수로 반환 시에 len(numbers) - k 만큼 잘라줘서 그랬다.
- 프로그래머스에서 테스트케이스가 조금 부족한 듯.(질문하기에도 테케 추가해달라는 글이 있었다)
'Algorithm' 카테고리의 다른 글
[알고리즘] BOJ 1789번 - 수들의 합(python3) (0) | 2023.06.07 |
---|---|
[알고리즘] BOJ 2667번 - 단지번호붙이기(python3) (2) | 2023.06.07 |
[알고리즘] BOJ 1806번 - 부분합(python3) (0) | 2023.06.02 |
[알고리즘] Programmers Level 1 - 체육복(python3) (0) | 2023.06.02 |
[알고리즘] BOJ 14502번 - 연구소(python3) (0) | 2023.06.02 |