본문 바로가기

카테고리 없음

[Algorithm-Java] 구현 - 상하좌우 문제

나동빈님이 "이것이 코딩테스트다" Youtube 강의 영상과 교재를 참고하여 문제를 풀었다.

 

문제

1. N x N 크기의 정사각형 공간

2. 시작 지점 (1, 1)

허접한 그림

행과 열을 간단하게 나타내 봤다.

여기서 우리는 L R U D 네가지 조건에 대해 행과 열을 옮겨 주어야한다.

(3,3) 기준 U의 경우 (2,3)으로 (-1,0)

(3,3) 기준 D의 경우 (4,3)으로 (1,0)

(3,3) 기준 L의 경우 (3,2)으로 (0,-1)

(3,3) 기준 R의 경우 (3,4)으로 (0,1)

 

의 변화를 보여준다.

 

전체적인 코드 가독성이 떨어져서 죄송합니다 ㅜ

int[] dx = {0,0,-1,1};
int[] dy = {-1,1,0,0};
char[] moveTypes = {'L','R','U','D'};

dx와 dy 는 각각 L, R, U, D 의 행과 열의 좌표를 나타낸다

즉, L(dx[0],dx[0]) = L(0,-1) 로서 위의 행렬표에서 보여주었다.

 

다음으로는 사용자가 입력한 L, R, U, D 값을 받아 와야하므로

Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); // 변의 길이가 N인 정사각형이므로 N값 받아오기
sc.nextLine(); // 버퍼 제거를 위해. 이 함수가 없으면 아래 문자열을 받아올 수가 없었다
int x = 1, y = 1; // 첫 좌표
String str = sc.nextLine(); // 공백을 포함한 해당 라인을 받아오기
str = str.replaceAll(" ",""); // replaceAll를 통해 공백을 없앤다
char[] tmp = str.toCharArray(); // 입력받은 문자열을 문자형태 배열로 저장

sc.nextLine()을 int n = sc.nextInt() 와 String str = sc.nextLine(); 사이에 넣어 주어야 버퍼가 제거되어 문자열을 받아올 수 있었다.

정확히 이해하지 못했으므로 따로 공부가 필요한 부분이다.

 

그 이후 입력받은 문자열을 Char형 배열로 저장을 한다.

for(int i = 0; i < tmp.length; i++)// 입력받은 L R U D의 개수만큼 반복 실행
{
    int nx = -1, ny = -1; // N * N 범위를 넘어가는지 확인하기 위한 변수(비교 후 초기화를 위해 해당 위치에 위치)
    for(int j = 0; j <moveTypes.length; j++) // L ,R ,U ,D 와 입력받은 문자열 비교
    {
    	if(tmp[i] == moveTypes[j]) // 만약, 입력받은 문자열과 타입이 같다면 하위 조건 실행
    	{
    	    nx = x + dx[j];
       	    ny = y + dy[j];
    	} 
    }
    if(nx <1 || ny < 1 || nx > n || ny > n) continue; // 범위를 넘어가는 경우 아래 대입을 실행하지 않기 위해.
    
    x = nx;
    y = ny;
}
    

 

머릿속에 로직과 알고리즘은 대강 짤 수 있었지만 구현을 해낼 역량이 없어서 너무 아쉬웠다. 금방 풀 수 있는 문제였음에도 불구하고 

toCharArry, nextLine의 용도, replaceAll 등을 잘 몰라 더욱 더 오래 걸렸던 것 같다. 나중에 이런 명령어도 따로 정리를 해 보아야 할 것 같다.