과일장수

2025. 1. 7. 16:04·공부/Code Cata

 

*초기 작성 코드

더보기
#include <string>
#include <vector>
#include <unordered_map>
#include <algorithm>

using namespace std;

void check_apple(unordered_map<int, int>& List, int k, const vector<int>& score)
{
    for (int i = 1; i <= k; ++i)
    {
        int k_cnt = count(score.begin(), score.end(), i);

        List[i] = k_cnt;
    }
}

int solution(int k, int m, vector<int> score)
{
    unordered_map<int, int> apple_cnt;
    int result = 0;

    // score 점수별로 사과가 몇 개 있는지 정리
    check_apple(apple_cnt, k, score);

    // k점수부터 1점수까지 m개씩 포장해서 점수 계산
    for (int i = k; i >= 1; --i)
    {
        // 만약 개수가 m보다 작다면 밑에 점수 개수에 저장
        if (apple_cnt[i] < m)
        {
            apple_cnt[i - 1] += apple_cnt[i];
            continue;
        }

        // m으로 나눈 몫 * 점수를 result에 더해 저장
        result += (apple_cnt[i] / m) * i * m;

        // 나머지를 밑에 점수 개수에 저장
        apple_cnt[i - 1] += apple_cnt[i] % m;
    }


    return result;
}
  • unordered_map을 사용해서 score의 점수 별로 사과가 몇 개 있는지 먼저 정리한 후 이 리스트를 가지고 최대 이익을 계산하는 방향으로 코드를 작성했다.
  • 문제에서 score의 크기가 1,000,000까지 아주 많은 경우가 생길 수 있는데, 현재 코드에서 count함수를 사용해 score 크기 만큼 루프를 k번이나 돌아야해서 비효율적이라는 생각이 들었다.
  • 루프를 최소화 하는 방향으로 다시 코드를 작성하려 고민했다.

 

*수정 코드

더보기
#include <string>
#include <vector>
#include <algorithm>

using namespace std;


int solution(int k, int m, vector<int> score)
{
    int result = 0;
    // score 내림차순으로 정렬
    sort(score.begin(), score.end(), greater<>());

    // i는 m씩 증가, i + m이 score.size를 초과하기 전까지 반복
    for(int i = 0; i + m <= score.size(); i += m)
    {
        // 내림차순 정렬했기 때문에 m번째 요소가 박스에 들어갈 최소 점수
        int min_score = score[i + m - 1];

        // 최소 점수 * 개수를 저장
        result += min_score * m;
    }


    return result;
}
  • 우선 score를 내림차순으로 정렬해주었다.
  • 정렬이 되었기 때문에, m번째 요소가 한 박스의 최소 점수가 되고 이를 m으로 다시 곱해 그 박스의 이익을 계산하였다.
  • 별도의 추가 컨테이너도 사용하지 않았고, 1개의 루프로 해결할 수 있어서 시간 또한 세이브되었다고 보여진다.

 

요즘 문제를 풀면서 더 효율적인 방법이 없을지 계속 생각하다 보니, 이것 저것 불필요한 컨테이너를 사용하게 되면서 오히려 과정이 더 많아져 코드가 복잡해지고 비효율적인 결과가 나오는 듯하다..:(

'공부 > Code Cata' 카테고리의 다른 글

소수가 되는 경우 카운팅 (재귀호출)  (1) 2025.01.08
모의고사 / 완전 탐색  (1) 2025.01.08
priority_queue 우선순위 큐 활용  (0) 2025.01.06
대칭되는 문자열 만들기  (0) 2025.01.03
람다 함수로 사용자 설정 정의해 정렬하기  (0) 2025.01.01
'공부/Code Cata' 카테고리의 다른 글
  • 소수가 되는 경우 카운팅 (재귀호출)
  • 모의고사 / 완전 탐색
  • priority_queue 우선순위 큐 활용
  • 대칭되는 문자열 만들기
동그래님
동그래님
  • 동그래님
    개발자 동그래
    동그래님
  • 전체
    오늘
    어제
    • 분류 전체보기 (210)
      • 공부 (51)
        • Code Cata (50)
      • 내배캠 (151)
        • TIL (50)
        • C++ (37)
        • Unreal Engine (48)
        • GAS(Gameplay Ability System.. (16)
      • Project (7)
        • Gunfire Paragon (5)
        • Arena Fighters (1)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    동그래님
    과일장수
    상단으로

    티스토리툴바

    단축키

    내 블로그

    내 블로그 - 관리자 홈 전환
    Q
    Q
    새 글 쓰기
    W
    W

    블로그 게시글

    글 수정 (권한 있는 경우)
    E
    E
    댓글 영역으로 이동
    C
    C

    모든 영역

    이 페이지의 URL 복사
    S
    S
    맨 위로 이동
    T
    T
    티스토리 홈 이동
    H
    H
    단축키 안내
    Shift + /
    ⇧ + /

    * 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.