Programmers_월간 코드 챌린지 시즌1 풍선 터트리기(python)
프로그래머스 -풍선 터트리기 문제 입니다.
1. 문제
https://programmers.co.kr/learn/courses/30/lessons/68646
2. 분류 및 난이도
Programmers 문제입니다.
월간 코드 챌린지 시즌1 문제입니다.
Level 3난이도의 문제입니다.
3. 생각한 것들(문제 접근 방법)
- a의 길이가 최대 백만이 들어오므로 brute하게 풀면 시간초과가 뜹니다.
- 기준 값을 중심으로 한쪽에 있는 배열중 가장 작은 값이 기준값보다 크면 다른 한쪽에 있는 배열중 가장 작은 값은 기준값보다 커야합니다.
- 이유는 토너먼트 방식으로 기준값의 왼쪽 배열, 오른쪽 배열 풍선 1개씩 남겨둘 수 있는데, 그 중 하나가 기준 값보다 작으면 문제에서 나온 대로 작은 값을 없애버릴 수 있지만 만약 둘 다 작은 경우(기준값이 두 값보다 큰 경우) 풍선을 터트릴 수 없게됩니다.
- 매 번 왼쪽 배열의 최소값, 오른쪽 배열의 최소값을 직접 구하면 시간초과가 뜨기에 오른쪽 배열의 최소값들은 따로 리스트에 저장해두었습니다.
- 위와 같은 방식으로 맨앞 경우 오른쪽 배열에서 가장 작은 값, 맨 뒤 경우 왼쪽 배열에서 가장 작은값만 남기는데, 그 값이 기준 값보다 커도 상관 없고, 작아도 상관없기에(작은 값을 지워버림.) a의 길이가 2보다 크거나 같다면 기본 return값은 2가 됩니다.
4. 접근 방법을 적용한 코드
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
def solution(a):
answer = 1
#a의 길이가 1인 경우
if len(a) == 1:
return 1
#아닌 경우 default는 2
answer+=1
#right는 기준 값을 기준으로 오른쪽 배열에서 가장 작은 값들을 저장해놓은 리스트입니다.
right = [0]* len(a)
#초기값 설정
rightmin = a[len(a)-1]
#리스트를 돌면서 초기화
for i in range(len(a)-2,0,-1) :
right[i] = rightmin
if rightmin > a[i]:
rightmin = a[i]
#왼쪽배열중 가장 작은 값 초기화
leftmin = a[0]
#맨 왼쪽과 맨 오른쪽은 제외
for i in range(1,len(a)-1) :
#만약 맨왼쪽의 최소값보다 작은 값이 나타난 경우 갱신
if leftmin > a[i-1] :
leftmin = a[i-1]
# 기준값이 최소값들보다 큰 경우 skip
if leftmin < a[i] and right[i] < a[i] :
continue
answer+=1
return answer
5. 결과
필요시. c++ 짜드리겠습니다. 설명이 필요시 댓글달아주세요.
This post is licensed under CC BY 4.0 by the author.