Community

개발자 99% 커뮤니티에서 수다 떨어요!

← Go back
Assignment9
#pragmatic
2년 전
555

💡 연습문제 4. 간단한 터틀 그래픽 시스템을 제어하기 위해 소형 언어를 하나 구현하려한다. 이 언어는 한 글자짜리 명령어들로 구성되는데, 어떤 명령어는 뒤에 한 자리 숫자가 따라 나올 수도 있다. 예를 들어 다음 내용을 입력하면 사각형이 하나 그려진다.

P 2 # 2번 펜을 선택한다

D # 펜을 종이에 가져다 댄다

W 2 # 서쪽으로 2cm 이동하며 그린다

N 1 # 그다음 북쪽으로 1cm 이동하며 그린다

E 2 # 그다음 동쪽으로 2cm 이동하며 그린다

S 1 # 그다음 다시 남쪽으로 그린다

U # 펜을 종이에서 뗀다

이 언어를 파싱하는 코드를 구현하라. 새로운 명령어를 추가하기 쉽게 코드를 설계해야 한다.

✅ 풀이 과정

자바로 파싱하는 코드를 작성해보았다.

  • 명령어를 담을 클래스를 정의했다.

public class Command {

    private String command;
    private Boolean argYn;
    private String func;

    public Command(String command, Boolean argYn, String func) {
        this.command = command;
        this.argYn = argYn;
        this.func = func;
    }

    public String getCommand() {
        return command;
    }

    public Boolean getArgYn() {
        return argYn;
    }

    public String getFunc() {
        return func;
    }
}

위와 같이 명령어 이름, argument 여부, 실행해야 할 함수를 담을 클래스를 정의했다.

  • 아래는 Command 클래스 Map 을 생성하는 코드이다.

private static Map<String, Command> createCommandMap() {
    Map<String, Command> commandMap = new HashMap<>();

    Command P = new Command("P", true, "doSelectPen");
    Command U = new Command("U", false, "doPenUp");
    Command D = new Command("D", false, "doPenDown");
    Command N = new Command("N", true, "doPenDir");
    Command E = new Command("E", true, "doPenDir");
    Command S = new Command("S", true, "doPenDir");
    Command W = new Command("W", true, "doPenDir");

    commandMap.put("P", P);
    commandMap.put("U", U);
    commandMap.put("D", D);
    commandMap.put("N", N);
    commandMap.put("E", E);
    commandMap.put("S", S);
    commandMap.put("W", W);
    return commandMap;
}

  • 아래는 실행하는 main 메서드이다.

public static void main(String[] args) {

    Map<String, Command> commandMap = createCommandMap();

    Scanner scan = new Scanner(System.in);
    String input = scan.nextLine();

    String key = input.substring(0,1);
    Command command = commandMap.get(key);

    if(command == null) {
        System.out.println("해당 명령어는 등록되어 있지 않습니다.");
        return;
    }

    if(input.length() > 1 && !command.getArgYn()) {
        System.out.println("인자가 필요하지 않습니다.");
        return;
    }

    if(input.length() <= 1 && command.getArgYn()) {
        System.out.println("인자가 필요합니다.");
        return;
    }

    String func = command.getFunc();
    System.out.println(func + "가 실행됩니다.");
}


이런식으로 파싱하는 코드를 작성해보았다.