백준 14503번 로봇 청소기 (삼성 SW 역량테스트 기출문제)


사용한 알고리즘: 구현...?


개인적으로 좀 빡쎈(?) 구현 문제였습니다.
무엇보다 문제 해석을 잘못하여 많이 헤맸습니다.

a.왼쪽 방향에 아직 청소하지 않은 공간이 존재한다면,

 이라는 표현이 보이는 왼쪽 길 전체 중 청소 하지 않은 구간 이라고 멍청하게 생각하는 바람에 몇시간을 헤맸습니다.
 물론 정확한 해석은 '바로 옆에 있는' 왼쪽 방향 지점 입니다. ㅎㅎ....

각설하고
(1) 현재 위치와 진행 방향 을 갖고 돌리는 함수 (Cleaning 이라는 이름)
(2) 해당 지점에서 다음 과정으로 가야하는 방향을 알려주는 함수 (DecideDir 라는 이름)

위 2가지 함수를 만들었습니다.

(1)번 함수는 문제의 조건
  1. 현재 위치를 청소한다.
  2. 현재 위치에서 현재 방향을 기준으로 왼쪽방향부터 차례대로 탐색을 진행한다.
    1. 왼쪽 방향에 아직 청소하지 않은 공간이 존재한다면, 그 방향으로 회전한 다음 한 칸을 전진하고 1번부터 진행한다.
    2. 왼쪽 방향에 청소할 공간이 없다면, 그 방향으로 회전하고 2번으로 돌아간다.
    3. 네 방향 모두 청소가 이미 되어있거나 벽인 경우에는, 바라보는 방향을 유지한 채로 한 칸 후진을 하고 2번으로 돌아간다.
    4. 네 방향 모두 청소가 이미 되어있거나 벽이면서, 뒤쪽 방향이 벽이라 후진도 할 수 없는 경우에는 작동을 멈춘다.
를 그대로 따랐습니다.

단, 과정 2-c 번에서 후진하고 다시 2번으로 돌아가는 과정에서
후진한 해당 칸을 청소하지 않는 것을 생각해 주기 위하여
(1)번 함수를 돌리는 경우 firststep 이라는 bool 을 추가해 주어, 해당 칸을 청소 할지 말지를 생각해 주었습니다. (true인 경우 청소를 해버리고 이를 cleaned라는 함수를 만들어 표시함. 청소한 칸은 다시 청소하지 않으므로.)

방향을 정하는 (2)번 함수는 그냥 계속 왼쪽을 보면서 나아갈 수 있는지 여부를 따졌습니다.

막상 써보니 간단하기도 한 것 같은 문제 인 것 같습니다...













댓글