알고리즘/프로그래머스
201002 [월간 코드 챌린지 시즌1] 9월 문제-풍선 터트리기
쭈친
2020. 10. 11. 16:05
programmers.co.kr/learn/courses/30/lessons/68646
코딩테스트 연습 - 풍선 터트리기
[-16,27,65,-2,58,-92,-71,-68,-61,-33] 6
programmers.co.kr
문제:
마지막까지 남을 수 있는 숫자의 개수를 구하는 문제입니다.
비교 했을 때 큰 값들은 무조건 제거 되고, 작은 값은 한 번만 제거 될 수 있습니다.
인접한 풍선을 터트리는데, 012가 있을 때 01이 아닌 12로 터트릴 수 있습니다. 그래서 양 끝은 무조건 남을 수 있습니다(가운데끼리 터트리고 가운데 1개가 남아서 총 3개일때는 터트리는 기준에 따라 남는 것이 달라지므로 3개 모두 최후의 풍선이 될 수 있습니다.).
다른 값들 보다 작으면 끝까지 남아서 정답 개수는 갱신 횟수입니다.
#include <string>
#include <vector>
using namespace std;
int solution(vector<int> a) {
int answer = 2;
if(a.size() <= 2 ) return a.size();
int left = a.front();
int right = a.back();
for(int i = 1; i < a.size()-1; i++){
if (left > a[i]){
answer++;
left = a[i];
}
if (right > a[a.size()-1-i]){
answer++;
right = a[a.size()-1-i];
}
}
if (left == right)
answer--;
return answer;
}
코드:
양 끝 값은 무조건 남으므로 기본 정답 값으로 2를 줬습니다.
벡터 a의 길이가 2보다 작으면 모두 살아 남으므로 a의 길이를 정답으로 리턴합니다.
left와 right는 양 끝 값에서 시작합니다.
작은 값이 살아남으므로 양 쪽에서 작은 값들을 찾아갑니다. 그리고 찾은 횟수만큼 정답을 더 해주고 값을 갱신합니다.
반복문을 탈출 했을 때 left와 right 값이 같으면 답이 중복 체크 된 것이라서 -1 해줍니다.