문제
문제 요약하면 다음과 같습니다.
- 한상자의 담으려는 귤의 갯수 k와 크기를 담은 배열 tangerine이 주어집니다
- 그 중에 가장 많이 겹치는 크기의 귤을 k개가 되도록 상자에 담습니다.
- 상자에 담긴 서로다른 크기의 종류의 갯수를 answer에 넣어 반환합니다.
문제를 보고, 귤이 크기 별로 몇개씩 있는지 알 수 있는 데이터가 필요하다고 생각했습니다.
자료 구조중에, 저는 딕셔너리를 선택했는데, key : 크기, value : 갯수와 같은 형식으로
데이터를 저장해놓으면, 이후에 문제를 풀기에 용이할것 같다는 생각이 들었기 때문입니다.
풀이
using System;
using System.Collections.Generic;
using System.Linq;
public class Solution {
public int solution(int k, int[] tangerine) {
int answer = 0; // 서로 다른 종류의 수
// 귤을 크기별로 담아 놓은 박스
Dictionary<int, int> tangerineBox = new Dictionary<int, int>(); // key: 크기, value: 갯수
// 귤을 박스에 담기
for (int i = 0; i < tangerine.Length; i++)
{
// 해당 타입이 tangerineBox에 존재하지 않다면 새로 추가
if (!tangerineBox.ContainsKey(tangerine[i]))
{
tangerineBox.Add(tangerine[i], 1);
}
// 이미 담겨져 있다면 갯수 추가
else
{
tangerineBox[tangerine[i]] += 1;
}
}
// 박스의 귤 중에 중복된 수가 많은 순으로 정렬하여 크기 리스트 생성
List<int> orderTangerine = tangerineBox.OrderByDescending(x => x.Value)
.Select(x => x.Key)
.ToList();
int temp = 0; // 담은 귤의 총 갯수
// 귤을 중복 수가 큰 순으로 담기
for (int i = 0; i < orderTangerine.Count; i++)
{
int currentSize = orderTangerine[i];
// 귤을 담아야 하는 갯수인 k에 도달할 때까지 반복
if (temp < k)
{
temp += tangerineBox[currentSize]; // 해당 크기의 귤 갯수만큼 담음
answer++; // 서로 다른 종류의 수 카운팅
}
else
{
break;
}
}
Console.WriteLine(answer);
return answer;
}
}
풀이과정은 아래와 같습니다.
1. tangerine에 있는 귤을 크기와, 갯수를 정리해, Dictionary 타입의 tagerineBox에 넣는다.
2. tangerineBox안에서 value, 즉 크기가 겹치는 수가 많은 순으로 정렬하여, 해당되는 key를 List에 저장한다
3. 정리된 List에서 문제에서 요구하는 k(갯수)를 충족할 때까지 딕셔너리 안에 value를 꺼냈을때,
사용된 서로 다른 종류의 수를 카운팅해서 answer에 넣는다
4. answer을 반환한다.
'알고리즘' 카테고리의 다른 글
프로그래머스 [C#] 멀리뛰기 (0) | 2024.11.04 |
---|---|
프로그래머스 [C#] 다음 큰 숫자 (0) | 2024.10.25 |
프로그래머스[C#] 이진 변환 반복하기 (0) | 2024.10.25 |
JadenCase 문자열 만들기 (0) | 2024.10.24 |
C# 최솟값 만들기 (0) | 2024.10.24 |