백준 1730번: 판화 [구현][시뮬레이션]-Java :: 매운코딩
728x90
300x250

https://www.acmicpc.net/problem/1730

 

1730번: 판화

로봇팔이 지나지 않은 점은 '.'으로, 로봇팔이 수직 방향으로만 지난 점은 '|'으로, 로봇팔이 수평 방향으로만 지난 점은 '-'으로, 수직과 수평 방향 모두로 지난 점은 '+'로 표기하도록 한다. 네 문

www.acmicpc.net

로봇 팔을 움직이는대로 목판 조각을 하는 알고리즘

 

로직은 제대로 돌아가는데 이상하게 런타임에러가 자꾸 나는 것이였다..

NoSuchElementException...

보통 해당 오류가 발생하는 case는 더 이상 입력이 주어지지 않는데, 계속 읽어들일려고 할 때다.

 

https://help.acmicpc.net/judge/rte/NoSuchElement

 

런타임 에러 (NoSuchElement)

ScannerScanner에서 이 에러가 발생하는 경우는 더 이상 입력받을 수 있는 값이 없을 때 입니다.import java.util.*; class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int a = sc.nextInt(); in

help.acmicpc.net

위의 예시를 보면 이해가 잘 갈것이다.

암튼.. 로봇팔의 움직임이 없는경우 그냥  " " 공백으로 2번째줄이 들어가게되는데,

그때의 경우를 고려하지 않았기때문에 계속 오류가 났던것..

 

<체크포인트>

BufferedReader의 br.readLine()가 Null이 아닌지?

StringTokenizer의 nextToken()을 수행하기 전, StringTokenizer가 값을 가지고 있는지? (hasMoreElements())

			st = new StringTokenizer(sbr);
			if(st.hasMoreElements())
				str = st.nextToken();

 

암튼 이러저러해서 코드는 끝이났다.

 

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub

		//System.setIn(new FileInputStream("Test.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		//입력
		int N = Integer.parseInt(st.nextToken());
		char pan[][] = new char[N][N];
		
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
//				Arrays.fill(pan[i],'.'); 
				pan[i][j]='.';
			}
		}
		
		
		String sbr = br.readLine();
		String str = "";
		if (sbr!= null) {
			st = new StringTokenizer(sbr);
			if(st.hasMoreElements())
				str = st.nextToken();
		}
		
		int x = 0;
		int y = 0;
		
		// 움직임 시작
		for (int i = 0; i < str.length(); i++) {
			//1. 방향 확인
			char dir = str.charAt(i);
			
			//2. 좌표 벗어나는지 체크
			int nx = x;
			int ny = y;
			//이동
			if(dir=='U') {
				nx -=1;
			} else if (dir == 'D') {
				nx +=1;
			} else if (dir == 'L') {
				ny -=1;
			} else if (dir == 'R') {
				ny +=1;
			}
			
			if(nx < 0 || nx >= N || ny < 0 || ny >= N) {
				continue;
			}
			
			
			//3. 현재위치 움직임 표시
			//3-1. 수직/수평/수직+수평 확인
			if((pan[x][y]=='|' && (dir =='R' || dir == 'L'))
					|| (pan[x][y]=='-' && (dir =='U' || dir == 'D'))) {
				pan[x][y] = '+';
			} else if(pan[x][y]=='.' && (dir =='R' || dir == 'L')) {
				pan[x][y] = '-';
			} else if(pan[x][y]=='.' && (dir =='U' || dir == 'D')) {
				pan[x][y] = '|';
			} 
			
			//4. 이동한 위치 움직임 표시
			if((pan[nx][ny]=='|' && (dir =='R' || dir == 'L'))
					|| (pan[nx][ny]=='-' && (dir =='U' || dir == 'D'))) {
				pan[nx][ny] = '+';
			} else if(pan[nx][ny]=='.' && (dir =='R' || dir == 'L')) {
				pan[nx][ny] = '-';
			} else if(pan[nx][ny]=='.' && (dir =='U' || dir == 'D')) {
				pan[nx][ny] = '|';
			} 
			
			
			//5. 현재위치 좌표 이동
			x= nx;
			y= ny;
		}
		
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				System.out.print(pan[i][j]);
			}
			System.out.println();
		}
	}

}
728x90

+ Recent posts