C++ - 더 맵게

2023. 3. 9. 00:26·프로그래머스

https://school.programmers.co.kr/learn/courses/30/lessons/42626?language=cpp 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

처음에 음식을 섞고 나온 결과 스코빌을 벡터의 원소로 추가하고 다시 오름차순 정렬하는 방식으로 구현했으나

이번 문제는 효율성 테스트가 있어 통과하지 못했습니다.

 

정렬을 없애고 원소를 추가할 때, 자동으로 오름차순이 만들어지게 인덱스를 추가하는 방법도 써보았으니 이 또한 시간 초과로 효율성 테스트를 통과하지 못했습니다.

 

이를 해결하기 위해 검색해보니 정렬 계산 횟수도 적고, 자동 오름차순 정렬이 가능한 우선순위 큐를 찾아 사용했습니다.

 

◈ 우선순위 큐 ( priority_queue )

원소가 삽입될 때 우선순위에 따라 자동 정렬되는 큐( queue )

자료구조 힙(Heap)으로 구현되었기에 원소 삽입(push) 시 정렬은 O(log N) 만에 이루어짐

pop으로 삭제할 시 정렬된 가장 앞의 항목부터

 

선언 : priority_queue<자료형, 컨테이너, 비교 함수> 변수명

 

비교 함수 : 기본 (비교함수를 쓰지 않음) - 내림차순

                   greater<자료형>                   - 오름차순

                   유저 정의 우선순위 - 구조체 활용 및 구조체 연산자 오버로딩, cmp 구조체

                   (유저 정의 우선순위까지 들어가는 건 TMI 같아서 지금은 패스)

 

기본 메서드

push()   : 원소 추가

pop()     : 가장 앞(top) 원소 제거

top()      : 가장 우선순위가 높은 원소

empty() : 큐가 비어있으면 true

size()    : 원소의 수

 

#include <string>
#include <vector>
#include <queue>

using namespace std;

int solution(vector<int> scoville, int K) {
    int answer = 0;

    // 새로운 원소를 받을 때 자동으로 오름차순으로 넣는 우선순위 큐를 사용
    //  = 계산 횟수를 크게 줄이면서 항상 오름차순 유지 > 효율성 테스트
    priority_queue<int, vector<int>, greater<int>> scoville_pq;
    for (size_t i = 0; i < scoville.size(); i++)
    {
        scoville_pq.push(scoville[i]);
    }

    while(true)
    {
        // 스코빌이 가장 낮은 음식이 기준 미만이라면
        if (scoville_pq.top() < K)
        {
            // 남은 음식이 단 하나 뿐이면
            if (scoville_pq.size() == 1)
            {
                // 모든 음식을 섞었으나 스코빌 지수를 K 이상으로 만들 수 없기에
                answer = -1;
                break;
            }

            // 혼합 횟수 + 1
            answer++;

            // 섞을 두 음식의 스코빌을 변수에 할당하고 큐에서 제거
            int food1 = scoville_pq.top();
            scoville_pq.pop();
            int food2 = scoville_pq.top();
            scoville_pq.pop();

            // 섞어서 스코빌을 높인 후 결과값을 큐에 추가
            int mixture_scoville = food1 + food2 * 2;
            scoville_pq.push(mixture_scoville);
        }
        // 스코빌이 가장 낮은 음식이 기준 이상이면,
        // 나머지 음식도 자동으로 더 높아지니 더 혼합할 필요가 없음
        else
            break;
    }
    return answer;
}

 

'프로그래머스' 카테고리의 다른 글

C# - 신고 결과 받기  (0) 2023.03.23
C# - 성격 유형 검사  (0) 2023.03.18
C# - 타겟 넘버  (0) 2023.03.02
C# - 조이스틱  (0) 2023.02.28
C# - 이모티콘 할인행사  (0) 2023.02.15
'프로그래머스' 카테고리의 다른 글
  • C# - 신고 결과 받기
  • C# - 성격 유형 검사
  • C# - 타겟 넘버
  • C# - 조이스틱
ybbro
ybbro
대부분의 포스팅은 pc에서 작성되었습니다. 모바일에서 볼 때 설명이 잘리면 데스크탑 모드를 사용해보길 바랍니다.
  • ybbro
    어떻게든 굴리는 게임 공방
    ybbro
  • 전체
    오늘
    어제
    • 전체
      • 스파르타코딩클럽_Unity개발과정
      • Unity 2D
        • 카드게임
        • 플랫포머 게임
        • 뱀서라이크
      • Unity 3D
        • 닷지
        • 유니티 짱
        • 디펜스 게임
      • Unity 에러 노트
      • 기능 구현 방법 정리
      • 셰이더 그래프
        • 2D
        • 3D
      • 프로그래머스
      • 자료구조
      • 기타
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    다크모드
    UI
    갤럭시 S24
    잔상
    유니티 애니메이터 파라미터 초기화
    유니티
    unity
    마스크
    텍스트매시프로
    무료스킨
    64비트
    세이브
    스파인
    sprite mask
    삭제
    직렬화
    hello
    앱이 휴대전화와 호환되지 않아 설치되지 않았습니다
    대시
    룰렛
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
ybbro
C++ - 더 맵게
상단으로

티스토리툴바