본문으로 바로가기

[백준 1347] 미로만들기 -JAVA //le_effort

category 알고리즘 2020. 7. 8. 18:56

미로 만들기

시간 제한메모리 제한제출정답맞은 사람정답 비율
2 초128 MB123860151850.000%

문제

홍준이는 미로 안의 한 칸에 남쪽을 보며 서있다. 미로는 직사각형 격자모양이고, 각 칸은 이동할 수 있거나, 벽을 포함하고 있다. 모든 행과 열에는 적어도 하나의 이동할 수 있는 칸이 있다. 홍준이는 미로에서 모든 행과 열의 이동할 수 있는 칸을 걸어다녔다. 그러면서 자신의 움직임을 모두 노트에 쓰기로 했다. 홍준이는 미로의 지도를 자기 노트만을 이용해서 그리려고 한다.

입력으로 홍준이가 적은 내용이 주어진다. 문자열로 이루어져 있으며, 모든 문자 하나는 한 번의 움직임을 말한다. ‘F’는 앞으로 한 칸 움직인 것이고, ‘L'과 ’R'은 방향을 왼쪽 또는 오른쪽으로 전환한 것이다. 즉, 90도를 회전하면서, 위치는 그대로인 것이다.

입력

첫째 줄에 홍준이가 적은 내용의 길이가 주어진다. 길이는 0보다 크고, 50보다 작다. 둘째 줄에 그 내용이 주어진다.

출력

첫째 줄에 미로 지도를 출력한다. ‘.’은 이동할 수 있는 칸이고, ‘#’는 벽이다.

예제 입력 1 복사

예제 출력 1 복사

 

풀이

아이디어 생각하기가 까다로운 문제이고 그것만 생각 한다면 어렵지 않게 풀 수 있는 문제

 

일단 어떻게 주어지는 입력만으로 맵을 그릴수 있는지에 대해 의문이 엄청 많았다.

일단 맵을 다 '#' 으로 그려놓고 해당하는 위치에서 부터 방향을 돌려가며 '.'

으로 채워 주면 된다.

 

아니 그래서 문제에 미로중 어느 한 칸에 위치 해있다는 것만 알고 있는데 그걸 어떻게 알까?

 

문제에 주어진 조건을 보자

첫째 줄에 홍준이가 적은 내용의 길이가 주어진다. 길이는 0보다 크고, 50보다 작다. 둘째 줄에 그 내용이 주어진다.

 

길이는 0보다 크고, 50보다 작다 -> 이게 힌트다

방향을 꺾지 않고 앞으로만 쭉 간다면 최대 50칸을 갈 수 있다.

 

그렇다면 100x100 짜리의 배열에 50,50 위치를 시작점으로 둔다고 생각해보자

위로 50칸을 가도 100x100 에 들어가고

아래로,오른쪽으로,왼쪽으로 50칸을 가도 맵의 범위 안에 들어 간다.

 

즉 그래서 50,50를 '임의의' 시작점으로 두고 시작한다.

그리고 R이나 L이 나오면 조건에 맞게 방향을 바꾸고

F가 나오면 현재 위치에서 방향에 따른 값을 더해주고 해당 위치를 '.' 으로 바꿔주면 된다

 

왜 '.'으로 바꾸는가? 움직 일 수 있는 칸이니 '.'으로 만들어 주면 된다.

 

이렇게 해서 맵에 '.' 기록을 다 끝났다면

이제 100 x 100 짜리 맵에서 어떻게 해당하는 직사각형을 그릴수 있을까?

 

직사각형의 성질을 떠올려보면 왼쪽위와 오른쪽 아래를 구하면 된다.

그래서 왼쪽위/ 오른쪽 아래를 구해주고 출력을 해주면 된다.

 

예시

..

.#

위 그림을 좌표로 표현하면

49,50 49,51

50,50 50,51

 

49,50과 50,51을 구하면 되는데

50,51은 # 으로 표시 돼 있고 나머지 3개만 '.' 으로 표현 돼 있다

3개의 '.' 을 통해서 #좌표를 얻는 방법은

우선 x좌표가 제일 커야하고 y좌표도 제일 커야한다

왼쪽위는 x,y 좌표가 제일 작으면 된다

 

전체코드