본문 바로가기
코딩테스트 준비/백준 C#

백준 C# - 14891 +) 풀이

by 코딩하는 돼징 2024. 4. 15.
반응형

문제를 읽어보다가 원형 테이블이 생각이 나서 Deque를 사용해서 풀어야겠다는 생각이 들었다!

 

01 회전 함수

C#은 Library에 deque를 가져와서 사용할 수가 없다. 그래서 List를 이용해서 구현하였다.

반시계 방향(== -1)인 경우 왼쪽으로 이동시키도록 하고 시계 방향(==1)인 경우 오른쪽으로 이동시켰다.

public static void turn(ref List<string> list, int dir)
{
    if (dir == -1)
    {
        string first = list[0];
        list.RemoveAt(0);
        list.Add(first);
    }
    else
    {
        string last = list[list.Count - 1];
        list.RemoveAt(list.Count - 1);
        list.Insert(0, last);
    }
}

02 양옆이 다른지 확인

public static bool check(List<string> left,List<string> right)
{
    return left[2] != right[right.Count - 2];
}

03 언제 양옆이 다른지 확인하는지 확인

문제를 똑바로 안읽어서 톱니바퀴를 회전하고 양옆을 확인하는 줄 알았다.. 하핳.. 문제를 꼼꼼히 읽는게 정말정말 중요하다!  먼저 양옆을 확인하므로 양옆을 모두 확인한 후 톱니바퀴를 돌려준다.

case 1:
if (check(list1, list2))
{
    if (check(list2, list3))
    {
        if (check(list3, list4)) turn(ref list4, -dir);
        turn(ref list3, dir);
    }
    turn(ref list2, -dir);
}
turn(ref list1, dir);
break;

코드 전문

using System.Collections.Generic;
using System;

class Solution
{
    public static void turn(ref List<string> list, int dir)
    {
        if (dir == -1)
        {
            string first = list[0];
            list.RemoveAt(0);
            list.Add(first);
        }
        else
        {
            string last = list[list.Count - 1];
            list.RemoveAt(list.Count - 1);
            list.Insert(0, last);
        }
    }

    public static bool check(List<string> left,List<string> right)
    {
        return left[2] != right[right.Count - 2];
    }
    public static void Main(string[] args)
    {
        string list1_array = Console.ReadLine();
        string list2_array = Console.ReadLine();
        string list3_array = Console.ReadLine();
        string list4_array = Console.ReadLine();

        List<string> list1 = new List<string>();
        List<string> list2 = new List<string>();
        List<string> list3 = new List<string>();
        List<string> list4 = new List<string>();
        for (int i = 0; i < 8; i++)
        {
            list1.Add(list1_array[i].ToString());
            list2.Add(list2_array[i].ToString());
            list3.Add(list3_array[i].ToString());
            list4.Add(list4_array[i].ToString());
        }

        int n = int.Parse(Console.ReadLine());

        while (n > 0)
        {
            n--;
            int[] input = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
            int num = input[0];
            int dir = input[1];

            switch (num)
            {
                case 1:
                    if (check(list1, list2))
                    {
                        if (check(list2, list3))
                        {
                            if (check(list3, list4)) turn(ref list4, -dir);
                            turn(ref list3, dir);
                        }
                        turn(ref list2, -dir);
                    }
                    turn(ref list1, dir);
                    break;
                case 2:
                    if (check(list2, list3))
                    {
                        if (check(list3, list4)) turn(ref list4, dir);
                        turn(ref list3, -dir);
                    }
                    if (check(list1, list2)) turn(ref list1, -dir);
                    turn(ref list2, dir);
                    break;
                case 3:
                    if (check(list2, list3))
                    {
                        if (check(list1, list2)) turn(ref list1, dir);
                        turn(ref list2, -dir);
                    }
                    if (check(list3, list4)) turn(ref list4, -dir);
                    turn(ref list3, dir);
                    break;
                case 4:
                    if (check(list3, list4))
                    {
                        if (check(list2, list3))
                        {
                            if (check(list1, list2)) turn(ref list1, -dir);
                            turn(ref list2, dir);
                        }
                        turn(ref list3, -dir);
                    }
                    turn(ref list4, dir);
                    break;
            }
        }
        int answer = 0;
        answer += int.Parse(list1[0]) == 0 ? 0 : 1;
        answer += int.Parse(list2[0]) == 0 ? 0 : 2;
        answer += int.Parse(list3[0]) == 0 ? 0 : 4;
        answer += int.Parse(list4[0]) == 0 ? 0 : 8;

        Console.Write(answer);
    }
}
반응형

'코딩테스트 준비 > 백준 C#' 카테고리의 다른 글

백준 C# - 1992 +) 풀이  (0) 2024.04.06
백준 C# - 14425 +) 풀이  (0) 2024.04.03
백준 C# - 2630 +) 풀이  (0) 2024.04.01
백준 C# - 1021 +) 풀이  (0) 2024.03.31
백준 C# - 14425  (0) 2024.03.31

댓글