Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 | 31 |
Tags
- 프로그래머스
- 구현
- DFS
- Level 3
- 시뮬레이션
- 백준
- 부스트코스
- c++
- 그리디
- 스택/큐
- Web
- Gold 4
- 월간 코드 챌린지
- 삼성 SW 역량 테스트
- next_permutation
- SWEA
- Level 4
- 2020 카카오 인턴십
- 코드리뷰
- level 1
- DP
- BFS
- 2019 KAKAO BLIND
- Gold 5
- 브루트포스
- Level 2
- 2020 KAKAO BLIND
- pass
- 코드 리뷰
- 백트래킹
Archives
- Today
- Total
Min:D's Devlog
[프로그래머스][2020 카카오 인턴십][C++] 보석 쇼핑 본문
문제
프로그래머스 2020 카카오 인턴십 - 보석 쇼핑 (Level 3)
문제 풀이
접근 방식
모든 보석을 하나 이상 포함하는 가장 짧은 구간을 구하는 문제이다.
문제를 해결하기 위해 우선, unordered_set을 이용하여 보석 종류의 개수를 구하였다.
그 후, for을 수행하며 unordered_map에 각 보석의 인덱스를 저장해주었다.
처음으로 모든 종류의 보석을 발견했을 때,
map에 저장되어 있는 인덱스의 최솟값을 answer의 시작 구간, 현재 인덱스(i + 1)를 끝 구간으로 저장해주었다.
또한, 이때의 최솟값의 보석 종류를 MIN_gen에 저장해두었다.
MIN_gen에 저장해둔 보석을 발견하는 경우는 최소 인덱스가 변경되는 경우이다.
이때마다 구간을 구하는 위의 과정을 반복하였고,
더 짧은 구간인 경우 answer의 값을 바꿔주며 문제를 해결하였다.
풀이 코드 - C++
#include <string>
#include <vector>
#include <unordered_map>
#include <unordered_set>
using namespace std;
vector<int> solution(vector<string> gems) {
// 보석 종류 개수 구하기
int len = gems.size();
unordered_set<string> gem_set;
for(int i = 0; i < len; i++)
gem_set.insert(gems[i]);
int total = gem_set.size();
// 가장 짧은 구간 구하기
int cnt = 0;
int MIN_len;
int MIN;
string MIN_gem;
vector<int> answer(2);
unordered_map<string, int> dic;
for(int i = 0; i < len; i++){
MIN = i+1;
if(dic[gems[i]] == 0){ // 새로운 보석 종류 발견 시
cnt++;
dic[gems[i]] = i+1;
if(cnt == total){
for(auto d : dic) {
if(MIN > d.second){
MIN = d.second;
MIN_gem = d.first;
}
}
answer[0] = MIN;
answer[1] = i + 1;
MIN_len = i + 1 - MIN;
}
continue;
}
dic[gems[i]] = i+1;
if(cnt == total && MIN_gem == gems[i]){ // 최솟값 인덱스 변경 시
for(auto d : dic) {
if(MIN > d.second){
MIN = d.second;
MIN_gem = d.first;
}
}
if(MIN_len > i + 1 - MIN) {
answer[0] = MIN;
answer[1] = i + 1;
MIN_len = i + 1 - MIN;
}
}
}
return answer;
}
실행 결과
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스][2020 카카오 인턴십] 경주로 건설 (0) | 2020.09.07 |
---|---|
[프로그래머스][2020 카카오 인턴십][C++] 수식 최대화 (0) | 2020.09.06 |
[프로그래머스][2017 카카오코드 예선][C++] 보행자 천국 (0) | 2020.08.31 |
[프로그래머스][DP][C++] 도둑질 (0) | 2020.08.30 |
[프로그래머스][그리디][C++] 단속카메라 (0) | 2020.08.29 |
Comments