CodingTest/Programmers Lv.2
[프로그래머스 C#] Lv.2 방문길이
주녘
2023. 11. 16. 19:29
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;
}
}