Hello, Freakin world!

[백준 1652번][Java] 누울 자리를 찾아라 - 정규표현식(반복자) 본문

알고리즘/PS

[백준 1652번][Java] 누울 자리를 찾아라 - 정규표현식(반복자)

johnna_endure 2020. 9. 25. 17:52

www.acmicpc.net/problem/1652

1652번: 누울 자리를 찾아라

첫째 줄에 방의 크기 N이 주어진다. N은 1이상 100이하의 정수이다. 그 다음 N줄에 걸쳐 N개의 문자가 들어오는데 '.'은 아무것도 없는 곳을 의미하고, 'X'는 짐이 있는 곳을 의미한다.

www.acmicpc.net

 

정규표현식 반복자를 활용할 수 있다면 간단하게 풀 수 있는 문제입니다.

 

그리고 문제 이해시 주의할 점은 단순하게 한 줄에 2개 이상의 자리가 있는지 판별하는게 아니라는 사실입니다.

예를 들어 한 줄이 ......X.. 일 경우 자리는 2개가 됩니다.

 

정규표현식 반복자에 대해 다른 분이 잘 정리한 글을 첨부합니다.

 

정규표현식 반복찾기

정규표현식 — 반복찾기

정규표현식의 가장 핵심 기능이라고 생각되는 부분이다.

medium.com

 

정규표현식을 활용하면 \.{2,} 라는 패턴을 이용해서 2개 이상의 빈 칸을 아주 손쉽게 카운트할 수 있습니다.

패턴의 의미는 . (이스케이프 필요)라는 문자를 최소 2번 이상 반복하는 문자열을 의미합니다.

 

(정규표현식 처음에는 표현이 어지러워서 극혐했는데 쓰면 쓸수록 재밌다는 생각이 드네요. 너무 편리합니다! 다들 써보세요~)

import java.io.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/*
누울 자리를 찾아라
https://www.acmicpc.net/problem/1652
 */
public class Main {
	static int n;
	static String[] room;
	public static void main(String[] args) throws IOException {
//		InputReader reader = new InputReader("testcase.txt");
		InputReader reader = new InputReader();
		n = reader.readInt();
		room = new String[n];
		for (int i = 0; i < n; i++) {
			room[i] = reader.readLine();
		}
		//가로 방향 체크
		int rowSeats = 0;
		for (int row = 0; row < n; row++) {
			rowSeats += howManySeats(room[row]);
		}

		int colSeats = 0;
		for (int col = 0; col < n; col++) {
			String line = scanCol(col);
			colSeats += howManySeats(line);
		}

		System.out.println(rowSeats + " " + colSeats);
		
	}

	private static String scanCol(int col) {
		StringBuilder sb = new StringBuilder();
		for (int row = 0; row < n; row++) {
			sb.append(room[row].charAt(col));
		}
		return sb.toString();
	}

	public static int howManySeats(String line) {
		Pattern pattern = Pattern.compile("(\\.{2,})");
		Matcher matcher = pattern.matcher(line);

		int cnt = 0;
		while(matcher.find()) {
			cnt++;
		}
		return cnt;
	}


}

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 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