주녘공부일지

[프로그래머스 C#] Lv.2 방문길이 본문

Programmers - C#/CodingTest Lv.2

[프로그래머스 C#] Lv.2 방문길이

주녘 2023. 11. 16. 19:29
728x90

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

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

결국 좌표 하나하나를 정점으로 봤을 때, 각 간선을 지나왔는지 체크해야하는 문제

- 가로 이동 방문배열과 세로 이동 방문배열을 선언하여 체크하였고, 인덱스 값과 맞추기 위해 주어진 문제에서의 0, 0 좌표를 5, 5로 둠 ( 음의 영역의 끝 부분인 -5를 0으로 잡을 수 있는 수 )

 

- 음의 방향으로 이동한다면 이동 후의 값을 인덱스로, 양의 방향으로 이동한다면 이동 전의 값을 인덱스로 판단해야 함 => 즉, 연산 후와 연산 전의 값 중에 작은 값을 인덱스 값으로 봐야 함

 ( ex. 4<->5 = 4 / 7<->8 = 7 로 인덱스 기준을 잡아야 해당하는 간선을 가리킬 수 있음 )

 

주석 참조

using System;

public class Solution 
{
    public int solution(string dirs) 
    {
        int answer = 0;
        int currPosX = 5, currPosY = 5;
        
        bool[,] h = new bool[11,11]; // 방문배열 (가로이동)
        bool[,] v = new bool[11,11]; // 방문배열 (세로이동)
        
        // 명령 수행 (각 명령에 따라 범위 체크 -> 처리)
        for(int i = 0; i < dirs.Length; i++)
        {
            switch(dirs[i])
            {
                case 'U':
                    if(currPosY <= 0)
                        continue;
                    
                    currPosY--;
                    if(h[currPosY,currPosX] == false)
                    {
                        h[currPosY,currPosX] = true;
                        answer++;
                    }
                    break;
                case 'D':
                    if(currPosY >= 10)
                        continue;
                    
                    if(h[currPosY,currPosX] == false)
                    {
                        h[currPosY,currPosX] = true;
                        answer++;
                    }
                    currPosY++;
                    break;
                case 'L':
                    if(currPosX <= 0)
                        continue;
                    
                    currPosX--;
                    if(v[currPosY,currPosX] == false)
                    {
                        v[currPosY,currPosX] = true;
                        answer++;
                    }
                    break;
                case 'R':
                    if(currPosX >= 10)
                        continue;
                    
                    if(v[currPosY,currPosX] == false)
                    {
                        v[currPosY,currPosX] = true;
                        answer++;
                    }
                    currPosX++;
                    break;
            }
            
        }
        
        return answer;
    }
}
728x90