Hello, Freakin world!

[백준 1952번][Java] 달팽이 2 본문

알고리즘/PS

[백준 1952번][Java] 달팽이 2

johnna_endure 2020. 10. 5. 19:32

www.acmicpc.net/problem/1952

 

1952번: 달팽이2

M줄 N칸으로 되어 있는 표 위에, 달팽이 모양으로 선을 그리려고 한다. 위의 그림은 M=5, N=3의 예이다. 이제 표의 왼쪽 위 칸(ㅇ)에서 시작하여, 오른쪽으로 선을 그려 나간다. 표의 바깥 또는 이미

www.acmicpc.net

 

달팽이 시리즈 문제입니다.

이전 달팽이 문제에서는 순회할 때 세야하는 칸의 개수를 유지했는데, 이번엔 이차원 boolean 배열을 이용해 방문한 곳을 체크하고 방문하지 않은 곳까지만 방문하는 방식으로 구현해봤습니다. 개인적으로 이 방법이 더 간단한 듯 하네요.

 

 

import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.StringTokenizer;

/*
달팽이2
https://www.acmicpc.net/problem/1952
 */
public class Main {
	static int m,n;
	static boolean[][] visited;
	public static void main(String[] args) throws IOException {
//		InputReader reader = new InputReader("testcase.txt");
		InputReader reader = new InputReader();
		StringTokenizer st = new StringTokenizer(reader.readLine());
		m = Integer.parseInt(st.nextToken());
		n = Integer.parseInt(st.nextToken());
		visited = new boolean[m][n];

		System.out.println(countCurvePoint());
	}

	static int[] dr = {0,1,0,-1};
	static int[] dc = {1,0,-1,0};
	private static int countCurvePoint() {
		int curvePoint = 0;
		int dirIdx = 0;
		int row = 0; int col = 0;
		visited[row][col] = true;
		while(true) {
			//이동
			int nextR = row+dr[dirIdx];
			int nextC = col+dc[dirIdx];
			while(isRange(nextR, nextC) && !visited[nextR][nextC]) {
				visited[nextR][nextC] = true;
				row = nextR; col = nextC;
				nextR = row+dr[dirIdx]; nextC = col+dc[dirIdx];
			}

			dirIdx =(dirIdx+1)%4;
			//다음 방향 바로 앞칸이 방문된 경우 종료
			if(visited[row+dr[dirIdx]][col+dc[dirIdx]]) break;
			curvePoint++;
		}
		return curvePoint;
	}

	private static boolean isRange(int row, int col) {
		if(row < 0 || row >= m || col < 0 || col >= n) return false;
		return true;
	}
}
class InputReader {
	private BufferedReader br;

	public InputReader() {
		br = new BufferedReader(new InputStreamReader(System.in));
	}

	public InputReader(String filepath) {
		try {
			br = new BufferedReader(new FileReader(filepath));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}

	public List<Character> readLineIntoCharList() throws IOException {
		List<Character> l = new ArrayList<>();
		while(true) {
			int readVal = br.read();
			if(readVal == '\n' || readVal == -1) break;
			l.add((char)readVal);
		}
		return l;
	}

	public boolean ready() throws IOException {
		return br.ready();
	}

	public String readLine() throws IOException {
		return br.readLine();
	}
	public int readInt() throws IOException {
		return Integer.parseInt(readLine());
	}
	public Long readLong() throws IOException {
		return Long.parseLong(readLine());
	}
}
Comments