이 영역을 누르면 첫 페이지로 이동
시간의화살 블로그의 첫 페이지로 이동

시간의화살

페이지 맨 위로 올라가기

시간의화살

행복하세요

[백준] 3987 보이저 1호 - Java

  • 2022.03.04 09:31
  • Algorithm/Baekjoon

 

 

 

이차원 배열을 활용해서 풀 수 있는 구현 문제이다.

 

언제 break를 걸어주고 언제 방향을 바꾸는지 잘 파악하고 풀도록 하자.

 

풀이 로직은 다음과 같다.

 

1. C를 만나거나 경로에서 이탈하게 되면 break

 

2. .을 만나면 continue

 

3. 행성을 만나게 되면 현재 방향에 따라서 방향을 틀어준다. 

 

마지막으로 무한으로 순환하게 되는 경우가 있는데, 이런 경우는 충분히 큰 수를 cnt변수와 비교해 무한으로 순환한다고 판단할 수 있다.

 

dir배열을 사용해 현재 진행하고 있는 방향을 표시했고, 방향을 전환할 때도 배열을 사용했다.

 

 

 

 

 

Java

 

 

import java.io.*;
import java.util.*;

public class Main {

	static char[][] map;
	static int N;
	static int M;
	static int[] dr = {-1,0,1,0}; // 북 동 남 서
	static int[] dc = {0,1,0,-1}; // 북 동 남 서 	
	static int cnt = 0;
	
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();

		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken()); // N M 입력

		map = new char[N][M];

		for(int i=0; i<N; i++){
			String str = br.readLine();
			for(int j =0; j<M; j++){
				map[i][j] = str.charAt(j);
			}
		} // map 채우기 

		st = new StringTokenizer(br.readLine(), " ");

		int PR = Integer.parseInt(st.nextToken()) -1;
		int PC = Integer.parseInt(st.nextToken()) -1;

		int[] ans_arr = new int[4]; // U R D L 순으로 정답을 담을거

		int dir = 0;

		for(int i=0; i<4; i++){
			cnt = 0;
			int r = PR;
			int c = PC;

			if(i == 0){
				dir = 0;
			}else if(i == 1){
				dir = 1;
			}else if(i == 2){
				dir = 2;
			}else if(i == 3){
				dir = 3;
			}

			while(true){
				cnt++;
				if(cnt>2500000){
					ans_arr[i] = 1000000000;
					break;
				}
				
					
				r = r + dr[dir];
				c = c + dc[dir];
				if(r == -1 || r == N || c == -1 || c == M || map[r][c]  == 'C'){
					ans_arr[i] = cnt;
					break;
				}

				if(map[r][c] == '.'){
					continue;
				}

				if(map[r][c] == '/'){
					if(dir == 0){
						dir = 1;
					}else if(dir == 1){
						dir = 0;
					}else if(dir == 2){
						dir = 3;
					}else if(dir == 3){
						dir = 2;
					}
					continue;
				}

				if(map[r][c] == '\\'){
					if(dir == 0){
						dir = 3;
					}else if(dir == 1){
						dir = 2;
					}else if(dir == 2){
						dir = 1;
					}else if(dir == 3){
						dir = 0;
					}
				}

			
				
				
			}
		}


		int max_idx = 0;
		int max = 0;
		
		for(int i=0; i<4; i++){
			if(ans_arr[i] > max){
				max = ans_arr[i];
				max_idx = i;
			}
		}

		char[] char_arr = {'U','R','D','L'};
		
		System.out.println(char_arr[max_idx]);
		if(max == 1000000000){
			System.out.println("Voyager");
		}else{
			System.out.println(max);
		}
		

	}
}
반응형

'Algorithm > Baekjoon' 카테고리의 다른 글

[백준] 15649 N과 M (1) - Java  (0) 2022.03.05
[백준] 15651 N과 M (3) - Java  (0) 2022.03.05
[백준] 1706 크로스워드 - Java  (0) 2022.03.02
[백준] 17299 오등큰수 -Java  (0) 2022.03.02
[백준] 14890 경사로 -Java  (0) 2022.03.01

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [백준] 15649 N과 M (1) - Java

    [백준] 15649 N과 M (1) - Java

    2022.03.05
  • [백준] 15651 N과 M (3) - Java

    [백준] 15651 N과 M (3) - Java

    2022.03.05
  • [백준] 1706 크로스워드 - Java

    [백준] 1706 크로스워드 - Java

    2022.03.02
  • [백준] 17299 오등큰수 -Java

    [백준] 17299 오등큰수 -Java

    2022.03.02
다른 글 더 둘러보기

정보

시간의화살 블로그의 첫 페이지로 이동

시간의화살

  • 시간의화살의 첫 페이지로 이동

검색

방문자

  • 전체 방문자
  • 오늘
  • 어제

카테고리

  • 분류 전체보기 (605)
    • Algorithm (205)
      • Data Structure (5)
      • Theory && Tip (33)
      • Baekjoon (166)
      • ALGOSPOT (1)
    • Spring (123)
      • Spring (28)
      • Spring Web MVC (20)
      • Spring Database (14)
      • Spring Boot (6)
      • Spring 3.1 (11)
      • Spring Batch (6)
      • Spring Security (16)
      • JPA (12)
      • Spring Data JPA (5)
      • QueryDSL (4)
      • eGovFramework (1)
    • Programming Language (74)
      • Java (19)
      • JavaScript (15)
      • C (25)
      • C++ (12)
      • Python (1)
      • PHP (2)
    • Computer Science (68)
      • Operating System (18)
      • Computer Network (16)
      • System Programming (22)
      • Universial Programming Lang.. (8)
      • Computer Architecture (4)
    • Database (21)
      • Database (7)
      • MySQL (3)
      • Oracle (3)
      • Redis (5)
      • Elasticsearch (3)
    • DevOps (20)
      • Docker && Kubernetes (8)
      • Jenkins (4)
      • Github Actions (0)
      • Amazon Web Service (8)
    • Machine Learning (28)
      • AI Introduction (28)
    • Mobile (28)
      • Android (21)
      • Flutter (7)
    • Solutions (13)
    • Life Logs (0)
    • 낙서장 (25)

최근 글

나의 외부 링크

메뉴

  • 홈

정보

13months의 시간의화살

시간의화살

13months

블로그 구독하기

  • 구독하기
  • RSS 피드

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. Copyright © 13months.

티스토리툴바