[ 문제 ]
《노 땡스!》는 3부터 35까지의 정수가 쓰인 수 카드를 이용하여 플레이할 수 있는 보드게임입니다. 수 카드를 경매를 통해서 낙찰받으며, 최종적으로 가지고 있는 수 카드를 이용하여 다음과 같이 점수를 계산합니다.
1. 정수들을 오름차순으로 정렬한 뒤, 이웃한 수끼리의 차가 1인 구간들로 그룹을 나눕니다.
2. 각 그룹별로 가장 작은 수를 모두 합한 값이 점수가 됩니다.
예를 들어 가지고 있는 수 카드가 6, 7, 10, 12, 13, 14, 15, 20, 21, 22라면, [6,7], [10], [12,13,14,15], [20,21,22]의 4개의 그룹으로 나뉘며, 점수는 6+10+12+20=48점입니다.
가지고 있는 수 카드가 주어졌을 때 점수를 계산하는 프로그램을 작성하세요.
[ 코드 ] - 처음 푼 내 코드
class Program
{
static void Main()
{
int N = int.Parse(Console.ReadLine());
List<int> numbers = new List<int>();
string[] input = Console.ReadLine().Split();
foreach (string s in input)
{
numbers.Add(int.Parse(s));
}
var result = GroupNum(numbers);
int min = SumNum(result);
Console.Write(min);
}
static List<List<int>> GroupNum(List<int> numbers)
{
var groups = new List<List<int>>();
var currentGroups = new List<int>();
foreach (var num in numbers.OrderBy(n => n))
{
if (!currentGroups.Any() || num == currentGroups.Last() + 1)
{
currentGroups.Add(num);
}
else
{
groups.Add(currentGroups);
currentGroups = new List<int> { num };
}
}
if (currentGroups.Any())
{
groups.Add(currentGroups);
}
return groups;
}
static int SumNum(List<List<int>> groups)
{
int sum = groups.Sum(groups => groups.Min());
return sum;
}
}
[ 풀이 ]
리스트를 만들어 연속되지않은 수가 나왔을때 새로운 리스트를 만들고 그렇지 않으면 계속 추가하는 코드고,
리스트에서 제일 최소인 값끼리 더하는 코드이다.
[
[6, 7],
[10],
[12, 13, 14, 15],
[20, 21, 22]
]
이런 구조로 저장됨.
그런데... 맞힌 분들 코드를 보다가 너무 쉽게 풀 수 있는 코드가 있어서 아 코딩은 이렇게 하는거구나 했다.
[ 코드 ] - 새로 푼 코드
public class Program
{
static void Main()
{
int n = int.Parse(Console.ReadLine());
int[] input = Array.ConvertAll(Console.ReadLine().Split(' '), int.Parse);
int answer = input[0];
for (int i = 1; i < n; i++)
{
if (input[i] - input[i - 1] > 1)
answer += input[i];
}
Console.Write(answer);
}
}
현재 숫자와 이전 숫자 간의 차이가 1보다 클때만 더해서 간단하게 값을 구해냈다. 흠 시간도 훨씬 빠르다.
이렇게 풀면서 배워가는 것 같당.
[ 실행화면 ]
문제링크: https://www.acmicpc.net/problem/27159
'Language > C#' 카테고리의 다른 글
[C#] 백준 2563번 색종이 (0) | 2024.02.06 |
---|---|
[C#] 백준 28014번 첨탑 밀어서 부수기 (0) | 2024.02.06 |
[C#] 백준 27465번 소수가 아닌 수 (0) | 2024.02.06 |
[C#] 백준 30454번 얼룩말을 찾아라! (3) | 2024.02.05 |
[C#] 백준 30821번 별자리가 될 수 있다면 (이항계수) (0) | 2024.02.05 |