하루 한 접시

[백준] 2816번: 디지털 티비 [C#]

NaZZU 2024. 5. 6. 17:57

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
using System.IO;
using System.Text;
using System.Linq;
using System.Reflection.PortableExecutable;
using System.Security.Cryptography;
 
namespace 연습장
{
    internal class Program
    {
        static StringBuilder sb = new StringBuilder();
        static void Main(string[] args)
        {
            using var reader = new StreamReader(Console.OpenStandardInput());
            using var print = new StreamWriter(Console.OpenStandardOutput());
 
            _2816_boj boj = new _2816_boj();
 
            boj.boj_2816();
 
        }
    }
    internal class _2816_boj
    {
        public void boj_2816()
        {
            int n = int.Parse(Console.ReadLine());
            string[] TV = new string[n];
 
            for (int i =0; i < n; i++)
                TV[i] = Console.ReadLine();
 
            List<int> ctrl = new List<int>();
            int pointer = 0;
            string temp;
            string[] KBS = { "KBS1""KBS2" }; // 코드 재활용을 위해 값이 들어있는 배열 생성
            for (int i = 0; i < 2; i++)
            {
                while (true)
                {
                    if (TV[i] == KBS[i]) // 올바르게 정렬 시 종료
                        break;
                    if (TV[i] != KBS[i]) // 먼저 KBS1을 첫번째 자리로 이동
                    {
                        if (i > 0 && TV[pointer] == KBS[i - 1])
                        {
                            ctrl.Add(1);
                            pointer++;
                            continue;
                        }
                        if (TV[pointer] == KBS[i]) // 현재 칸이 KBS1이라면
                        {
                            temp = TV[pointer];
                            TV[pointer] = TV[pointer - 1];
                            TV[pointer - 1= temp;
                            ctrl.Add(4); // 4번 연산 수행
                            pointer--;
                            continue;
                        }
                        if (pointer == i && TV[pointer + 1== KBS[i]) // KSB1이 1번에 위치한다면
                        {
                            temp = TV[pointer];
                            TV[pointer] = TV[pointer + 1];
                            TV[pointer + 1= temp;
                            ctrl.Add(3); // 3번 연산 수행
                            pointer++;
                            continue;
                        }
 
                        if (TV[pointer + 1!= KBS[i]) // 포인터가 가리키는 칸의 아래가 KBS1이 아니라면
                        {
                            temp = TV[pointer];
                            TV[pointer] = TV[pointer + 1];
                            TV[pointer + 1= temp;
                            ctrl.Add(3); // 3번 연산 수행
                            pointer++;
                            continue;
                        }
                        if (TV[pointer + 1== KBS[i]) // 아래칸이 KBS1이라면
                        {
                            pointer++;
                            ctrl.Add(1); // 1번 연산 수행
                            continue;
                        }
                    }
                }
            }
            foreach (var _ in ctrl)
                Console.Write(_);
 
        }
    }
}
 
cs

브론즈 문제지만 주어진 조건을 모두 사용한다면 꽤나 생각해 볼만한 것들이 많았던 문제였다. 맛있는 문제!

처음에는 while문 안에 두개의 분기를 만들어 (분기 1: 아직 KBS1을 맨 위 칸으로 불러오자, 분기 2: KBS2를 다음 칸으로 불러오자)

해주려 했지만 너무 코드의 길이가 길어지는것 같아 KBS1/ 2가 담긴 배열에서 값을 불러와서 사용하는 방향으로 틀어주었다.

기본 구조는 아래칸이 찾으려 하는 방송국 (KBS1 /2)가 아닐 때 3번 연산을 진행해 위치를 교환하고,

아래칸이 찾으려는 방송국이면 1번 연산을 진행해 해당 방송국으로 포인터를 옮기고, 해당 방송국을 알맞는 위치 (KBS1은 0으로, KBS2는 1로) 4번 연산을 통해 이동해준다.

예외사항으로 해당 포인터가 해당 방송국의 목표위치에 있으며, 아래칸에 해당 방송국이 있다면 3번 연산을 진행하며,

KBS1을 4번 연산을 진행해서 목표 위치로 가져왔을경우 기본연산인 3번연산을 진행하면 안되기 때문에, 1번 연산을 진행해 주었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
using System.IO;
using System.Text;
using System.Linq;
using System.Reflection.PortableExecutable;
using System.Security.Cryptography;
 
namespace 연습장
{
    internal class Program
    {
        static StringBuilder sb = new StringBuilder();
        static void Main(string[] args)
        {
            using var reader = new StreamReader(Console.OpenStandardInput());
            using var print = new StreamWriter(Console.OpenStandardOutput());
 
            _2816_boj boj = new _2816_boj();
 
            boj.boj_2816();
 
        }
    }
        internal class _2816_boj
    {
        public void boj_2816()
        {
            int n = int.Parse(Console.ReadLine());
            string[] TV = new string[n];
 
            for (int i =0; i < n; i++)
                TV[i] = Console.ReadLine();
 
            List<int> ctrl = new List<int>();
            int pointer = 0;
            while (true)
            {
                if (TV[0== "KBS1" && TV[1== "KBS2")
                    break;
                if (TV[0!= "KBS1")
                {
                    if (TV[pointer] != "KBS1")
                    {
                        ctrl.Add(1);
                        pointer++;
                    }
                    if (TV[pointer] == "KBS1")
                    {
                        string temp;
                        temp = TV[pointer];
                        TV[pointer] = TV[pointer - 1];
                        TV[pointer - 1= temp;
                        ctrl.Add(4);
                        pointer--;
                    }
                }
                if (TV[1!= "KBS2" && TV[0== "KBS1")
                {
                    if (TV[pointer] != "KBS2")
                    {
                        ctrl.Add(1);
                        pointer++;
                    }
                    if (TV[pointer] == "KBS2")
                    {
                        string temp;
                        temp = TV[pointer];
                        TV[pointer] = TV[pointer - 1];
                        TV[pointer - 1= temp;
                        ctrl.Add(4);
                        pointer--;
                    }
                }
            }
            foreach (var _ in ctrl)
                Console.Write(_);
        }
    }
}
 
cs

이건 첫번째에 짰던 코드인데 설마 싶어서 마지막에 출력해주는 것을 WriteLine에서 Write 로 바꿔주니 맞았다....

브론즈 문제 맞네... 맞어...