[BAEKJOON] 백준 20436: ZOAC 3 (C#)

2024. 10. 16. 15:45IT/BaekJoon

문제 링크

https://www.acmicpc.net/problem/20436

 

 

문제

2020년 12월, 세 번째로 개최된 ZOAC의 오프닝을 맡은 성우는 누구보다 빠르게 ZOAC를 알리려 한다.

하지만 안타깝게도 성우는 독수리타법이다!

  • 독수리 타법이란 양 손의 검지손가락만을 이용해 타자를 치는 타법이다.
  • 성우는 한글 자음 쪽 자판은 왼손 검지손가락으로 입력하고, 한글 모음 쪽 자판은 오른손 검지손가락으로 입력한다.
  • a의 좌표가 (x1, y1)이고, b의 좌표가 (x2, y2)일 때, a에 위치한 성우의 손가락이 b로 이동하는 데에는 a와 b의 택시 거리 |x1-x2|+|y1-y2| 만큼의 시간이 걸린다.
  • 각 키를 누르는 데에는 1의 시간이 걸린다.
  • 성우는 두 손을 동시에 움직일 수 없다.
  • 성우가 사용하는 키보드는 쿼티식 키보드이며, 아래 그림처럼 생겼다.

바쁜 성우를 위하여 해당 문자열을 출력하는 데 걸리는 시간의 최솟값을 구해보자.

 

 

입력

첫 번째 줄에는 두 알파벳 소문자 sL, sR이 주어진다. sL, sR은 각각 왼손 검지손가락, 오른손 검지손가락의 처음 위치이다.

그 다음 줄에는 알파벳 소문자로 구성된 문자열이 주어진다. 문자열의 길이는 최대 100자이다. 빈 문자열은 주어지지 않는다.

 

 

출력

입력으로 주어진 문자열을 출력하는 데에 걸리는 시간의 최솟값을 출력한다.

 

 

통과한 답안

namespace _20436
{
    internal class Program
    {
        static Dictionary<char, (int, int)> keyboard = new Dictionary<char, (int, int)>
        {
            {'q', (0, 0)}, {'w', (0, 1)}, {'e', (0, 2)}, {'r', (0, 3)}, {'t', (0, 4)}, {'y', (0, 5)}, {'u', (0, 6)}, {'i', (0, 7)}, {'o', (0, 8)}, {'p', (0, 9)},
            {'a', (1, 0)}, {'s', (1, 1)}, {'d', (1, 2)}, {'f', (1, 3)}, {'g', (1, 4)}, {'h', (1, 5)}, {'j', (1, 6)}, {'k', (1, 7)}, {'l', (1, 8)},
            {'z', (2, 0)}, {'x', (2, 1)}, {'c', (2, 2)}, {'v', (2, 3)}, {'b', (2, 4)}, {'n', (2, 5)}, {'m', (2, 6)}
        };

        static HashSet<char> leftKeys = new HashSet<char> { 'q', 'w', 'e', 'r', 't', 'a', 's', 'd', 'f', 'g', 'z', 'x', 'c', 'v' };

        static void Main(string[] args)
        {
            string[] startPos = Console.ReadLine().Split(' ');
            string input = Console.ReadLine();

            char leftPos = startPos[0][0];
            char rightPos = startPos[1][0];

            int time = 0;

            for (int i = 0; i < input.Length; i++)
            {
                if (leftKeys.Contains(input[i]))
                {
                    time += MovePos(ref leftPos, input[i]);
                }
                else
                {
                    time += MovePos(ref rightPos, input[i]);
                }
            }

            Console.WriteLine(time);
        }

        private static int MovePos(ref char pos, char target)
        {
            var (curX, curY) = keyboard[pos];
            var (targetX, targetY) = keyboard[target];

            int distance = Math.Abs(curX - targetX) + Math.Abs(curY - targetY) + 1;

            pos = target;
            return distance;
        }
    }
}

 

현재 손가락의 위치가 주어지고, 작성해야될 문자열이 주어졌을 때,

쿼터식 키보드를 독수리 타법(양 손의 한 손가락만 이용해서 타자를 치는 타법)과

한글 자음은 왼손으로 한글 모음은 오른손으로 누르는 경우,

입력받은 문자열을 작성하는데 필요한 시간을 구하는 문제이다.

 

쿼터식 키보드의 키의 위치를 좌표화하여 Dictionary에 저장하고,

HashSet을 이용하여 왼손으로 눌러야하는 키들을 저장하였다.

 

이후에 초기 손가락의 위치와 입력해야되는 문자열을 받은 뒤에

어느 손가락으로 눌러야되는지 판단하고, 각각의 문자를 누르는데 걸리는 시간을 더하도록 구현하였다.

 

손가락을 움직이는데는 택시 거리 방식을 이용하므로

Math.Abs(X - newX) + Math.Abs(Y - newY)의 방식을 이용하였으며,

누르는데 걸리는 시간인 1을 더하도록 작성하였다.

 

택시 거리는 이전에 정리했었던 아래의 내용을 참고하였다.

 

https://lawrence1031.tistory.com/196

 

20240511_택시 기하학

오늘의 TIL은 택시 기하학의 내용이다. 백준 알고리즘 문제 3053(택시 기하학)를 풀다가 접하게 된 개념으로문제 자체는 간단한 내용의 문제였지만,개념적으로 이해하는 부분이 어려움이 있어서

lawrence1031.tistory.com

 

 

 

'IT > BaekJoon' 카테고리의 다른 글

[BAEKJOON] 백준 16719: ZOAC (C#)  (0) 2024.10.16
[BAEKJOON] 백준 18238: ZOAC 2 (C#)  (0) 2024.10.16
[BAEKJOON] 백준 23971: ZOAC 4 (C#)  (0) 2024.10.16
[BAEKJOON] 백준 26594: ZOAC 5 (C#)  (0) 2024.10.16
[BAEKJOON] 백준 30045: ZOAC 6 (C#)  (1) 2024.10.16