-
8911번: 거북이
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 컨트롤 프로그램이 주어진다. 프로그램은 항상 문제의 설명에 나와있는 네가지 명령으로만 이루어져
www.acmicpc.net
문제
해당 문제는 거북이 로봇에게 명령을 하고 난 뒤 거북이 로봇의 이동 경로를 통해 이동 경로가 모두 포함되는 가장 작은 직사각형의 넓이를 구하는 문제다.
조건
명령어는 총 네 가지가 있으며, F : 직진, B : 후진, R : 우회전, L : 좌회전이다.
L과 R명령에 대해서는 이동이 아닌 회전만 진행한다.
시작은 북쪽을 보며 시작한다.
직사각형을 만들지 않는 경우도 존재한다.
풀이
해당 문제를 처음 보고 map를 갱신하면서 최종적으로 map를 탐색해서 y , x 값의 길이를 구해 포함되는 직사각형을 만들면 되겠다 생각했었는데 문제를 풀던중 그냥 좌표만 계속 갱신하면 되겠다고 생각이 들어 좌표값으로만 문제를 해결했다.
먼저 이동에 관해 상 우 하 좌 순으로 이동하도록 델타를 구성하였고, 시작 좌표와 각 좌표별 max, min값을 저장할 변수를 0으로 초기화하였다.
turtle이라는 메서드를 이용해서 로직을 구현하였는데 F, B에 대해서는 직진과 후진이라 단지 델타 값을 더해주고 빼주는 식으로 하였고, R의 경우 dir(방향을 알려주는 index) 값을 1 증가시키고 만약 4가 넘을 경우를 위해 %4를 통해 0 1 2 3이 반복하도록 하였고, L의 경우 dir값을 1 감소시키고 삼항 연산자를 이용해서 0 1 2 3이 반복할 수 있도록 해주었고, 명령어를 하나씩 수행하고 나면 각 좌표별 max값과 min값을 갱신해주고 모든 명령어를 수행하고 나면 이동한 y좌표 길이와 x좌표 길이를 구해 둘을 곱해주면 가장 작은 직사각형의 넓이를 알 수 있다.
코드
import java.io.BufferedReader; import java.io.InputStreamReader; public class Main { static int dir, dy[] = { -1, 0, 1, 0 }, dx[] = { 0, 1, 0, -1 }; static int y, x, maxy, maxx, miny, minx; static char[] msg; public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int T = Integer.parseInt(br.readLine()); for (int t = 1; t <= T; t++) { dir = x = y = maxy = maxx = miny= minx = 0; msg = br.readLine().toCharArray(); turtle(); } } static void turtle() { for (int i = 0; i < msg.length; i++) { if (msg[i] == 'F') { //직진 현재 방향값으로 +1칸 저장 y += dy[dir]; x += dx[dir]; } else if (msg[i] == 'B') { //후진 현재 방향값으로 -1값 저장 y -= dy[dir]; x -= dx[dir]; } else if (msg[i] == 'R') //우회전 dir+1 해주고 4가 되면 0이 되어야하므로 나머지 연산 dir = ++dir % 4; else // L dir = --dir < 0 ? 3 : dir; //좌회전 dir-1 해주고 삼항연산자를 이용해서 값 저장 // 각각 좌표별 max, min값 갱신 maxy = Math.max(y, maxy); maxx = Math.max(x, maxx); miny = Math.min(y, miny); minx = Math.min(x, minx); } // 작업 수행 끝나면 각 x,y별 길이를 더하고 곱해줌 => 결과값 System.out.println((Math.abs(maxx)+Math.abs(minx)) * (Math.abs(maxy) + Math.abs(miny))); } }
GitHub - JUNGSOONIL/JAVA: JAVA 소스 코드
JAVA 소스 코드. Contribute to JUNGSOONIL/JAVA development by creating an account on GitHub.
github.com
728x90'알고리즘 > Baekjoon' 카테고리의 다른 글
Baekjoon 11060 점프 점프 JAVA (0) 2022.03.05 Baekjoon 3184 양 JAVA (0) 2022.01.17 Baekjoon 2002 추월 JAVA (0) 2022.01.13 Baekjoon 2910 빈도 정렬 JAVA (0) 2022.01.12 Baekjoon 14442 벽 부수고 이동하기 2 JAVA (0) 2022.01.11 댓글