급한 상황이기에 이론은 뒤로 미루고 일단 Linq를 적극 활용하기로 했다.
연습 문제
1. 백준 1431 : https://www.acmicpc.net/problem/1431
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main(string[] args)
{
int N = int.Parse(Console.ReadLine());
List<string> serials = new List<string>();
for (int i = 0; i < N; i++)
{
serials.Add(Console.ReadLine());
}
serials.Sort((a, b) =>
{
if (a.Length != b.Length)
return a.Length.CompareTo(b.Length);
int sumA = a.Where(char.IsDigit).Sum(c => c - '0');
int sumB = b.Where(char.IsDigit).Sum(c => c - '0');
if (sumA != sumB)
return sumA.CompareTo(sumB);
return string.Compare(a, b);
});
foreach (string serial in serials)
{
Console.WriteLine(serial);
}
}
}
CompareTo()는 IComparable 인터페이스의 메서드로, 두 객체를 비교할 때 사용된다.
- 반환 값:
- 음수: 현재 객체가 비교 대상보다 작음
- 0: 두 객체가 같음
- 양수: 현재 객체가 비교 대상보다 큼
Where()는 LINQ(Language Integrated Query)의 확장 메서드로, 컬렉션에서 조건에 맞는 요소들만 선택할 때 사용된다.
char.IsDigit의 경우 문자열에서 숫자만 선택한다.
string.Compare(a, b)는 두 문자열 a와 b를 사전식으로 비교한다.
- 반환 값:
- 음수: a가 b보다 사전식으로 앞에 옴
- 0: a와 b가 동일함
- 양수: a가 b보다 사전식으로 뒤에 옴
2. 백준 11652 : https://www.acmicpc.net/problem/11652
var n = int.Parse(Console.ReadLine());
long[] arr = new long[n];
for (int i = 0; i < n; i++)
{
arr[i] = long.Parse(Console.ReadLine());
}
Array.Sort(arr);
int mxcnt = 1;
long mxval = arr[0];
int currentCnt = 1;
for (int i = 1; i < n; i++)
{
if (arr[i] == arr[i - 1])
{
currentCnt++;
}
else
{
if (currentCnt > mxcnt)
{
mxcnt = currentCnt;
mxval = arr[i - 1];
}
currentCnt = 1;
}
}
if (currentCnt > mxcnt)
{
mxval = arr[n - 1];
}
Console.WriteLine(mxval);