코딩 테스트를 준비하며 자주 마주치는 문제 유형들과,
C#의 강력한 기능(LINQ, 내장 함수 등)을 활용해 우아하게 해결하는 방법을 정리했습니다.
문제 요약: 1부터 6까지 숫자가 적힌 주사위 네 개를 굴려,
나온 숫자의 조합(모두 같은지, 3개가 같은지, 2개씩 같은지 등)에 따라 다른 점수를 계산하는 문제입니다.
단순히 if-else로 모든 경우의 수를 나누면 코드가 매우 복잡해집니다.
이럴 때는 "주사위 숫자들을 그룹으로 묶고, 개수가 많은 순서대로 정렬"하면
조건 분기가 훨씬 단순해집니다.
using System;
using System.Linq;
public class Solution
{
public int solution(int a, int b, int c, int d)
{
int[] dice = { a, b, c, d };
// 숫자별로 그룹을 묶고, 나온 횟수(Count)가 많은 순서대로 내림차순 정렬
var groups = dice.GroupBy(x => x)
.OrderByDescending(g => g.Count())
.ToList();
// 1. 네 숫자가 모두 같음 (그룹이 1개)
if (groups.Count == 1) return 1111 * groups[0].Key;
// 2. 종류가 2가지일 때 (3개-1개 또는 2개-2개)
if (groups.Count == 2)
{
int p = groups[0].Key;
int q = groups[1].Key;
if (groups[0].Count() == 3) // 3개 - 1개
return (int)Math.Pow(10 * p + q, 2);
else // 2개 - 2개
return (p + q) * Math.Abs(p - q);
}
// 3. 두 개가 같고, 나머지 두 개는 각각 다름 (그룹이 3개)
if (groups.Count == 3) return groups[1].Key * groups[2].Key;
// 4. 네 숫자가 모두 다름 (그룹이 4개)
return dice.Min();
}
}
문제 요약: 문자열 형식으로 주어진 아주 큰 숫자를 9로 나눈 나머지를 구하는 문제입니다.
숫자가 너무 커서 int나 long의 범위를 넘어설 수 있습니다.
"어떤 수를 9로 나눈 나머지는 그 수의 각 자리 숫자를 모두 더한 값을 9로 나눈 나머지와 같다"는
수학적 규칙을 이용해, 문자열에서 문자를 하나씩 꺼내 숫자로 변환한 뒤 합산합니다.
using System;
using System.Linq;
public class Solution
{
public int solution(string number)
{
// 문자를 숫자로 변환할 때 c - '0' 을 활용하여 모두 더한 뒤 9로 나눕니다.
return number.Sum(c => c - '0') % 9;
}
}
문제 요약: 문자열 my_string과 [s, e] 형태의 쿼리 배열이 주어집니다.
각 쿼리는 인덱스 s부터 e까지의 문자열을 뒤집으라는 의미이며,
모든 쿼리를 순서대로 처리한 결과를 반환해야 합니다.
문자열은 데이터 조작이 편한 List<char>로 변환하여 작업합니다.
C# 리스트의 내장 함수인 .Reverse(시작 인덱스, 뒤집을 개수)를 사용하면
투 포인터를 직접 구현할 필요 없이 단 한 줄로 구간을 깔끔하게 뒤집을 수 있습니다.
using System;
using System.Text;
using System.Collections.Generic;
public class Solution
{
public string solution(string my_string, int[,] queries)
{
List<char> my_char = new List<char>(my_string);
for (int i = 0; i < queries.GetLength(0); i++)
{
int s = queries[i, 0];
int e = queries[i, 1];
// s부터 (e - s + 1)개의 요소를 뒤집음
my_char.Reverse(s, e - s + 1);
}
StringBuilder answer = new StringBuilder();
for (int k = 0; k < my_char.Count; k++)
{
answer.Append(my_char[k]);
}
return answer.ToString();
}
}
예제: my_string = "hello", queries = [[1, 2], [3, 4]]
리스트 내부 뒤집기 처리 (my_char)
['h', 'e', 'l', 'l', 'o'][1, 2] 후: ['h', 'l', 'e', 'l', 'o'] (인덱스 1~2 구간 뒤집힘)[3, 4] 후: ['h', 'l', 'e', 'o', 'l'] (인덱스 3~4 구간 뒤집힘)[1, 4] 후: ['h', 'o', 'l', 'l', 'e'] (인덱스 1~4 구간 뒤집힘)최종 반환을 위한 answer 변수 누적 과정 (StringBuilder)
answer = ""k = 0: answer.Append('h') ➔ "h"k = 1: answer.Append('l') ➔ "hl"k = 2: answer.Append('e') ➔ "hle"k = 3: answer.Append('o') ➔ "hleo"k = 4: answer.Append('l') ➔ "hleol"최종 반환값: "hleol"