inblog logo
|
LHS's Study Space
    알고리즘문제풀기C#

    [알고리즘 문제 풀기] 카드 놓기(5568)

    C#
    lhs's avatar
    lhs
    Apr 07, 2025
    [알고리즘 문제 풀기] 카드 놓기(5568)
    Contents
    1. 문제 풀이 아이디어2. 나의 정답 코드3. 정리
    www.acmicpc.net
    https://www.acmicpc.net/problem/5568
    notion image

    1. 문제 풀이 아이디어

    • 백트래킹을 활용하여 선택한 카드를 이어붙인 문자열을 만들고, 이를 집합에 저장하여 중복을 제거한 조합의 수를 구해 문제를 해결할 수 있다.

    2. 나의 정답 코드

    using System.Text; StringBuilder sb = new StringBuilder(""); using (StreamReader sr = new StreamReader(Console.OpenStandardInput())) using (StreamWriter sw = new StreamWriter(Console.OpenStandardOutput())) { int n = int.Parse(sr.ReadLine()); int k = int.Parse(sr.ReadLine()); string[] card = new string[n]; bool[] chk = new bool[n]; HashSet<string> set = new HashSet<string>(); for (int i = 0; i < n; i++) { card[i] = sr.ReadLine(); } solve(0); sw.WriteLine(set.Count); void solve(int count) { if (count == k) { set.Add(sb.ToString()); return; } for (int i = 0; i < n; i++) { if (chk[i]) continue; chk[i] = true; sb.Append(card[i]); solve(count + 1); sb.Remove(sb.Length - card[i].Length, card[i].Length); chk[i] = false; } } }

    3. 정리

    • solve 함수는 재귀적으로 동작하며, k개의 카드를 선택했을 때 StringBuilder에 저장된 문자열을 집합에 추가한다.
    • chk 배열을 통해 중복 선택을 방지하고, 문자열을 추가하고 제거하는 방식으로 백트래킹을 수행한다.
    • 집합 set을 통해 중복 문자열을 제거하고 최종적으로 고유한 조합의 개수를 출력한다.
    Share article
    Contents
    1. 문제 풀이 아이디어2. 나의 정답 코드3. 정리

    LHS's Study Space

    RSS·Powered by Inblog