본문 바로가기
Algorithms

[Java] 로봇 문제

by Brian Go 2021. 9. 19.

어쩌다보니 자바로 지역 icpc를 나가게 되어 급하게 공부하고 있다.

중간점검차 기출문제를 한 번 풀어보게 되었는데, 생각보다 자바를 엄청나게 잘 다뤄야 할 필요는 없었던 듯.

이게 문제였다.

이런 문제는 진짜 난생 처음 겪어봐서 어떻게 풀어야 할지 구상하는 데만 한참이 걸렸는데,

일단 풀기 위한 키로 보였던 요소들은

1. x나 y좌표가 nxn에서 n보다 크면 무조건 -1 반환.

2. 현재 보고 있는 방향을 변수에 저장.

3. 마지막으로 움직인 방향을 변수에 저장.

 

그러면 북쪽으로 갈 때는 y값을 더해주고 남쪽으로 가면 빼주고,

같은 방법으로 x를 처리해주면 될 것 같았다.

 

문제는 방향. 좌로 돌기, 우로 돌기가 있었는데 그것을 위해 2,3번을 고안해냈던 것.

그런데 두 값을 합쳐서, 마지막으로 본 방향만 기억하고 있으면

논리 결정에 큰 도움이 될 듯 했다.

 

그래서 크게 뼈대를 세워 봤는데, if 명령어가 MOVE라면 마지막으로 본 방향에 따라 x,y값을 처리하고

if 명령어가 TURN이라면 그 안에서 마지막으로 본 방향에 따라 방향을 바꿔주면 되었다.

즉 if문 안의 if문으로 풀 수 있겠다, 싶었다.

 

import java.util.*;


public class Robot{

	    public static void main(String[] args) {
	    	Scanner sc = new Scanner(System.in);
	    	int Square = sc.nextInt();
	    	int command_length = sc.nextInt();
	    	int x_pos = 0;
	    	int y_pos = 0;
	    	String past_movement = "E";
	    	String direction = "E";

	    	for(int i = 1; i <= command_length; i++) {
	    		String command = sc.next();
	    		int command_num = sc.nextInt();
	    		
	    		if("MOVE".equals(command)) {

	    			if("S".equals(past_movement)) {
	    				y_pos -= command_num;
	    				past_movement = "S";
	    			} else if("N".equals(past_movement)) {
	    				y_pos += command_num;
	    				past_movement = "N";
	    			} else if("E".equals(past_movement)) {
	    				x_pos += command_num;
	    				past_movement = "E";
	    			} else if("W".equals(past_movement)) {
	    				x_pos -= command_num;
	    				past_movement = "W";
	    			} 
	    			}
	    		else if("TURN".equals(command)) {
	    			
	    			if(command_num == 0) {
		    			if("S".equals(past_movement)) {
		    				past_movement = "E";
		    			} else if("N".equals(past_movement)) {
		    				past_movement = "W";
		    			} else if("E".equals(past_movement)) {
		    				past_movement = "N";
		    			} else if("W".equals(past_movement)) {
		    				past_movement = "S";
		    			}
	    			} else if(command_num == 1) {
	    				if(past_movement=="S") {
	    					past_movement = "W";
	    				} else if("N".equals(past_movement)) {
	    					past_movement = "E";
	    				} else if("E".equals(past_movement)) {
	    					past_movement = "S";
	    				} else if("W".equals(past_movement)) {
	    					past_movement = "N";
	    				}
	    			}
	    		
	    		}
	    		System.out.println("현재 x 좌표는 "+x_pos+", y 좌표는 "+y_pos+"입니다."+past_movement+"쪽을 바라보고 있습니다.");
	    	}
	    	sc.close();
	    	if(x_pos<0 || y_pos<0 || x_pos>Square || y_pos>Square) {
	    		System.out.println("좌표가 범위를 벗어났습니다. (반환값 : "+-1+")");
	    	} else {
	    		System.out.println("[실행 종료]"+"\n"+"최종 좌표는 x : "+x_pos+ ", y : " + y_pos + "입니다.");
	    	}
	    }
	    }

좀 더 깔쌈한 풀이가 있을까 했지만, 아무래도 현재 내 수준에서는 최선이었던 듯.

for문을 통해 정해진 범위에서만 스크립트가 반복되게 하고,

매 try마다 명령어와 숫자를 따로 받아준다.

명령어가 MOVE면 past_movement 변수에 따라서 xy값을 처리해주고

TURN이라면 past_movement 변수에 따라서 방향을 재정의해주면 되었다.

 

처음엔 past_movement 변수 말고 direction이라는 변수도 정의해서 값을 따로 처리했는데,

사고의 확장(?)이 실현되었는지 두 값을 동시에 처리해도 아무런 문제가 없다는 것을 인지.

ㅎㅎ

 

그리고 문자열끼리의 비교에서 .equals()을 써줘야 한다는 사실을 배웠다.

(처음에 if command==MOVE를 썼는데 안 되더라. 알고 보니까 == 연산자는 메모리 주소를 비교한다고..?)

 

하여튼.. 그래도 금방 풀어서 기부니가 좋다 !

댓글