[C#] 알고리즘 기초 풀이 모음: LINQ 활용 및 문자열 조작

정광훈(Unity_9기)·2026년 2월 21일

TIL (Today I Learned)

목록 보기
105/110

코딩 테스트를 준비하며 자주 마주치는 문제 유형들과,
C#의 강력한 기능(LINQ, 내장 함수 등)을 활용해 우아하게 해결하는 방법을 정리했습니다.


1. 조건이 복잡한 주사위 게임 (LINQ GroupBy 활용)

문제 요약: 1부터 6까지 숫자가 적힌 주사위 네 개를 굴려,
나온 숫자의 조합(모두 같은지, 3개가 같은지, 2개씩 같은지 등)에 따라 다른 점수를 계산하는 문제입니다.

💡 풀이 아이디어

단순히 if-else로 모든 경우의 수를 나누면 코드가 매우 복잡해집니다.
이럴 때는 "주사위 숫자들을 그룹으로 묶고, 개수가 많은 순서대로 정렬"하면
조건 분기가 훨씬 단순해집니다.

💻 C# 코드

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();
    }
}

2. 큰 숫자 다루기: 9로 나눈 나머지

문제 요약: 문자열 형식으로 주어진 아주 큰 숫자를 9로 나눈 나머지를 구하는 문제입니다.

💡 풀이 아이디어

숫자가 너무 커서 intlong의 범위를 넘어설 수 있습니다.
"어떤 수를 9로 나눈 나머지는 그 수의 각 자리 숫자를 모두 더한 값을 9로 나눈 나머지와 같다"
수학적 규칙을 이용해, 문자열에서 문자를 하나씩 꺼내 숫자로 변환한 뒤 합산합니다.

💻 C# 코드

using System;
using System.Linq;

public class Solution
{
    public int solution(string number)
    {
        // 문자를 숫자로 변환할 때 c - '0' 을 활용하여 모두 더한 뒤 9로 나눕니다.
        return number.Sum(c => c - '0') % 9;
    }
}

3. 문자열 여러 번 뒤집기 (특정 구간 뒤집기)

문제 요약: 문자열 my_string[s, e] 형태의 쿼리 배열이 주어집니다.
각 쿼리는 인덱스 s부터 e까지의 문자열을 뒤집으라는 의미이며,
모든 쿼리를 순서대로 처리한 결과를 반환해야 합니다.

💡 풀이 아이디어

문자열은 데이터 조작이 편한 List<char>로 변환하여 작업합니다.
C# 리스트의 내장 함수인 .Reverse(시작 인덱스, 뒤집을 개수)를 사용하면
투 포인터를 직접 구현할 필요 없이 단 한 줄로 구간을 깔끔하게 뒤집을 수 있습니다.

💻 C# 코드

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();
    }
}

🔍 문자열과 answer가 변하는 과정 (Trace)

예제: my_string = "hello", queries = [[1, 2], [3, 4]]

  1. 리스트 내부 뒤집기 처리 (my_char)

    • 초기 상태: ['h', 'e', 'l', 'l', 'o']
    • 1차 쿼리 [1, 2] 후: ['h', 'l', 'e', 'l', 'o'] (인덱스 1~2 구간 뒤집힘)
    • 2차 쿼리 [3, 4] 후: ['h', 'l', 'e', 'o', 'l'] (인덱스 3~4 구간 뒤집힘)
    • 다른 예시 (초기 상태 기준) [1, 4] 후: ['h', 'o', 'l', 'l', 'e'] (인덱스 1~4 구간 뒤집힘)
  2. 최종 반환을 위한 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"

0개의 댓글