트랙
/
Go
Go
/
연습 문제
/
로봇 시뮬레이터
로봇 시뮬레이터

로봇 시뮬레이터

보통

지침

로봇 시뮬레이터를 만들어요.

로봇 공장의 시험 시설에는 로봇의 움직임을 검증할 프로그램이 필요해요.

로봇이 할 수 있는 움직임은 세 가지예요:

  • 오른쪽으로 회전
  • 왼쪽으로 회전
  • 전진

로봇은 가상의 무한 격자에서 특정 방향(north, east, south, west 중 하나)을 향한 채 {x,y} 좌표, 예를 들어 {3,8}에 놓여요. 좌표는 north와 east 방향으로 갈수록 커져요.

그다음 로봇은 여러 명령을 받아요. 그러면 시험 시설이 로봇의 새로운 위치와 로봇이 향하고 있는 방향을 검증해요.

  • 문자열 "RAALAL"은 다음과 같은 뜻이에요:
    • 오른쪽으로 회전
    • 두 번 전진
    • 왼쪽으로 회전
    • 한 번 전진
    • 또다시 왼쪽으로 회전
  • 로봇이 {7, 3}에서 north 방향을 향한 채 시작한다고 해봐요. 그러면 이 명령들을 실행했을 때 로봇은 {9, 4}에서 west 방향을 향하고 있어야 해요.

구현 참고 사항

테스트는 3단계로 나뉘어 있어요.

go test로 모든 테스트를 실행하거나, -tags 옵션으로 특정 테스트만 실행할 수 있어요.

예시:

go test                      # run all tests
go test -tags step1          # run just step 1 tests.
go test -tags 'step1 step2'  # run step1 and step2 tests

테스트 프로그램이 필요로 하는 여러 가지를 정의한 소스 파일 defs.go가 주어져요. 이 파일은 단계별로 세 개의 섹션으로 구성되어 있어요.

1단계

1단계를 완료하려면 Right, Left, Advance, N, S, E, W, Dir를 정의해야 해요. 2단계로 넘어가기 전에 1단계를 먼저 끝내요.

2단계

1단계에서는 로봇의 움직임을 구현했어요. 하지만 그것만으로는 시뮬레이션이라고 보기 어려워요. 예를 들어 소스 코드에서 "로봇"은 어디에 있을까요? "격자"는 어디에 있을까요? 로봇의 행동을 격자 위의 위치로 바꾸는 계산은 어디에 있을까요? 로봇일까요, 격자일까요? 실제 물리적 세계는 이와 달라요.

2단계에서는 "방"을 도입해요. 사소한 추가처럼 보이지만, "방", "로봇", "테스트 프로그램"의 역할을 명확히 하고 시뮬레이션의 물리를 정리하기 위해 큰 변화를 만들어요. Room과 Robot은 함수로 정의해요. 테스트 프로그램이 이들을 고루틴으로 실행하면 "존재하게" 돼요. 정보는 Go 채널을 통해 테스트 프로그램, 로봇, 방 사이를 오가요.

Room을 "물리 엔진"이라고 생각해 봐요. 벽과 로봇이 있는 물리적인 방을 모델링하고 시뮬레이션하는 거예요. Room은 방의 좌표 공간, 로봇과 벽의 위치를 어떻게든 모델링하고, 예를 들어 로봇이 벽을 통과하지 않도록 보장해야 해요. Robot은 행동을 수행하는 주체이고, Room은 일관된 진실을 유지하는 역할이에요.

테스트 프로그램이 채널을 만들고 Room과 Robot을 모두 실행해요. 그다음 테스트 프로그램이 Robot에 명령을 보내요. 명령을 다 보내면 명령 채널을 닫아요. Robot은 명령을 받아들이고, 시도하려는 행동을 Room에 알려야 해요. 명령 채널이 닫히는 것을 감지하면 스스로를 종료해야 해요. 방은 로봇의 행동이 가져오는 물리적 결과를 해석해야 해요. 로봇이 종료되는 것을 감지하면 테스트 프로그램으로 최종 보고를 보내서, 로봇의 최종 위치와 방향을 알려요.

3단계

3단계에는 세 가지 큰 변화가 있어요:

  • 로봇은 개별 명령에 응답하는 대신 스크립트를 실행해요.
  • 로그 채널을 통해 로봇과 방이 메시지를 기록할 수 있어요.
  • 방은 여러 로봇이 동시에 존재하고 동작할 수 있게 해줘요.

Room3에서 보내는 최종 위치 보고에는 robots 채널에서 받은 것과 같은 슬라이스를 반환하면 돼요. 위치와 방향만 갱신해서요. 다음의 경우에는 로그 채널로 메시지를 보내야 해요.

  • 이름이 없는 로봇
  • 중복된 로봇 이름
  • 같은 위치에 놓인 로봇들
  • 방 밖에 놓인 로봇
  • 스크립트에 정의되지 않은 명령
  • 알 수 없는 로봇의 행동
  • 벽으로 전진하려는 로봇
  • 다른 로봇으로 전진하려는 로봇

출처

유명 기업의 면접 질문에서 영감을 받았어요.
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Go Exercism

로봇 시뮬레이터 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 Go 트랙을 개념 34개연습 문제 165개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.