주녘공부일지

[프로그래머스 C#] Lv.2 행렬 테두리 회전하기 본문

Programmers - C#/CodingTest Lv.2

[프로그래머스 C#] Lv.2 행렬 테두리 회전하기

주녘 2023. 11. 3. 15:00
728x90

https://school.programmers.co.kr/learn/courses/30/lessons/77485

1. 정답코드 및 핵심 아이디어, 유의사항

- 보통 가로축을 x, 세로축을 y로 보는 것이 익숙하기 때문에 헷갈릴 수 있음

 -> 문제에서는 가로축 y, 세로축 x로 잡기 때문에 덜 헷갈리기 위해 통일해서 풀이

- 주어진 조건에 따른 직사각형 범위의 테두리에 해당하는 값을 회전시켜야 하므로 Queue를 이용함

- 조건에 따르면, 무조건 시작점 -> 도착점을 이루는 직사각형을 시계방향으로 회전시키기 때문에 한 사이클은 시작점에서 우측 -> 아래 -> 좌측 -> 위 방향을 한 사이클로 봐도 되며, 값을 저장하여 다음 값을 주는 것을 반복해야 하므로 Queue를 이용

https://godgjwnsgur7.tistory.com/46

 

[C#] 자료구조 ( 제네릭 컬렉션 )

자료구조(Data Structure)란? 데이터를 효율적으로 접근하고 조작할 수 있게 데이터 구조를 만들어 관리하는 것 - Collections은 C#에서 지원하는 자료구조 클래스 using System.Collections.Generic; 제네릭 컬렉

godgjwnsgur7.tistory.com

주석 참조

    using System;
    using System.Collections.Generic;

    public class Solution
    {
        public int[] solution(int rows, int columns, int[,] queries)
        {
            List<int> answerList = new List<int>();
            Queue<int> queue = new Queue<int>();
            // 주어진 문제 기준에 따라 세로축 x, 가로축 y로 잡음
            int[,] intArrays = new int[rows + 1, columns + 1]; // 행렬

            // 행렬 값 세팅
            int num = 1;
            for (int i = 1; i < intArrays.GetLength(0); i++)
            {
                for (int j = 1; j < intArrays.GetLength(1); j++)
                {
                    intArrays[i, j] = num;
                    num++;
                }
            }

            for (int i = 0; i < queries.GetLength(0); i++)
            {
                int currPosX = queries[i, 0];
                int currPosY = queries[i, 1];
                int minValue = intArrays[currPosX, currPosY];
                queue.Enqueue(minValue);

                // 1. 오른쪽 이동 (y++)
                while (queries[i, 3] > currPosY)
                {
                    currPosY++;

                    if (intArrays[currPosX, currPosY] < minValue)
                        minValue = intArrays[currPosX, currPosY];

                    queue.Enqueue(intArrays[currPosX, currPosY]);
                    intArrays[currPosX, currPosY] = queue.Dequeue();
                }

                // 2. 아래 이동 (x++)
                while (queries[i, 2] > currPosX)
                {
                    currPosX++;

                    if (intArrays[currPosX, currPosY] < minValue)
                        minValue = intArrays[currPosX, currPosY];

                    queue.Enqueue(intArrays[currPosX, currPosY]);
                    intArrays[currPosX, currPosY] = queue.Dequeue();
                }

                // 3. 왼쪽 이동 (y--)
                while (queries[i, 1] < currPosY)
                {
                    currPosY--;

                    if (intArrays[currPosX, currPosY] < minValue)
                        minValue = intArrays[currPosX, currPosY];

                    queue.Enqueue(intArrays[currPosX, currPosY]);
                    intArrays[currPosX, currPosY] = queue.Dequeue();
                }

                // 4. 오른쪽 이동 (x--)
                while (queries[i, 0] < currPosX)
                {
                    currPosX--;

                    if (intArrays[currPosX, currPosY] < minValue)
                        minValue = intArrays[currPosX, currPosY];

                    queue.Enqueue(intArrays[currPosX, currPosY]);
                    intArrays[currPosX, currPosY] = queue.Dequeue();
                }

                answerList.Add(minValue);
                queue.Clear();
            }

            return answerList.ToArray();
        }
    }
728x90