728x90
반응형
https://school.programmers.co.kr/learn/courses/30/lessons/131130
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
---------------------------------------------------핵심 알고리즘--------------------------------------------
방문한 상자를 visited[]로 표시.
1~n까지 루프를 돌면서,
!visited[]인 상자에 대해서만 상자를 열어 작업을 시작한다.
열어본 상자의 개수를 그룹의 개수로 저장 + priority queue에 각 그룹의 개수를 저장.
그룹의 개수 중 큰 두 개를 선택해 곱해 리턴.
---------------------------------------------------풀이----------------------------------------------------
#include <string>
#include <vector>
#include <queue>
#include <iostream>
using namespace std;
// 그룹의 카드 개수 내림차순.
priority_queue<int, vector<int>, less<int> > pq;
bool visited[101] = {false, };
vector<int> cards;
int find_group(int cur){
if(visited[cur]){
return 0;
}
visited[cur] = true;
return find_group(cards[cur-1])+1;
}
// 카드 1~100. n 이하의 카드와 그 수만큼의 상자.
// 카드를 무작위로 섞어 상자에 1~n을 붙임.
// 임의의 상자를 선택해 카드 확인->그 카드 숫자의 상자 열어 카드 확인->...
// => 1번 상자 그룹
// 임의의 상자를 선택해 카드 확인->그 카드 숫자의 상자 열어 카드 확인->...
// => 2번 상자 그룹
// 게임 점수 = 1번 상자 수 * 2번 상자 수
// 최대 점수=?
// 상자 순서대로 카드 번호 배열 cards.
int solution(vector<int> _cards) {
cards = _cards;
int answer = 0;
// 그룹 별 개수 구하기
for(int i = 1; i <= cards.size(); i++){
if(!visited[i]){
pq.push(find_group(i));
}
}
int n1 = pq.top(), n2 = 0;
pq.pop();
// 그룹이 하나만 존재하면 0점
if(!pq.empty()){
n2 = pq.top();
}
answer = n1 * n2;
return answer;
}
---------------------------------------------------후기----------------------------------------------------
cards[]는 0부터 나타나있는데 실제로 카드의 숫자는 1부터이므로 이 부분에서 오류가 났었다.
728x90
반응형
'알고리즘' 카테고리의 다른 글
[BOJ] 1978 소수 찾기 (0) | 2023.05.24 |
---|---|
[BOJ] 1874 스택수열 (1) | 2023.05.24 |
[programmers] 연속 부분 수열 합의 개수 (0) | 2023.05.20 |
[programmers] 고고학 최고의 발견 (1) | 2023.05.19 |
[programmers] 2차원 동전 뒤집기 (0) | 2023.05.18 |