[백준 1652번] 누울 자리를 찾아라 with Java

guswls·2024년 5월 5일
1

알고리즘

목록 보기
20/39
post-custom-banner

문제


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



코드


import java.io.*;

class Main {

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		boolean[][] matrix;

		int N = Integer.parseInt(br.readLine());

		matrix = new boolean[N][N];
		for (int i = 0; i < N; i++) {
			String[] inputs = br.readLine().split("");
			for (int j = 0; j < N; j++) {
				String input = inputs[j];

				if (input.equals(".")) {
					matrix[i][j] = true;
				} else {
					matrix[i][j] = false;
				}
			}
		}

		int rowCount = 0;
		int colCount = 0;
		// 세로로 누울 수 있는 자리 구하기
		for (int i = 0; i < N; i++) {
			int count = 0;
			for (int j = 0; j < N; j++) {
				if (matrix[j][i]) {
					count++;
				} else {
                	//[중요!!] 장애물 만났을 때도 따져야 됨
					if (count > 1) {
						colCount++;
					}
					count = 0;
				}
			}

			if (count > 1) {
				colCount++;
			}
		}

		// 가로로 누울 수 있는 자리 구하기
		for (int i = 0; i < N; i++) {
			int count = 0;
			for (int j = 0; j < N; j++) {
				if (matrix[i][j]) {
					count++;
				} else {
					if (count > 1) {
						rowCount++;
					}
					count = 0;
				}
			}

			if (count > 1) {
				rowCount++;
			}
		}

		System.out.println(rowCount + " " + colCount);
	}
}


문제 이해


  • 2차원 배열에 X, 혹은 . 둘 중 하나가 랜덤하게 채워져있다.
  • 이때 한 지점에 대해서 가로방향, 혹은 세로방향으로 .이 연속적으로 2개 이상 존재하는 영역은 누울 수 있다.
  • 누운 자리는 벽, 혹은 X가 나타날 때까지 쭉 늘린다.
  • 이때 방에 가로방향과 세로방향 각각으로 누울 수 있는 자리의 개수를 출력한다.


풀이 방법


  • boolean 2차원 배열을 선언해서 .이면 true, X면 false로 값을 채워넣는다.
  • 이중 for문을 통해 rowCount, colCount를 각각 구한다.
  • 로직은 다음과 같다.
    1. 이중 for문을 통해 가로 혹은 세로로 boolean 배열에 접근한다.
      (세로는 matrix[j][i], 가로는 matrix[i][j])
    2. 각 줄을 탐색하기 전에 count를 0으로 초기화한다.
    3. 만약 현재 배열 값이 true면 count를 증가시키고, false면 count를 0으로 초기화한다.
    4. 각 줄에서 장애물을 만날 때, 혹은 벽에 부딪혔을 때 count가 2이상이면 rowCount 혹은 colCount를 증가시킨다.


핵심 포인트


  • 크게 고민할 것 없이 문제에 명시된대로 구현하면 되지만, 함정이 존재한다.
  • rowCount, colCount의 갱신조건이 한 라인을 모두 탐색한 후 뿐만 아니라 벽을 만났을 때도 포함되어야 한다.
  • 이 조건을 넣지 않는다면, 바로 입구컷되어버린다. 문제를 잘 읽어봐야한다.


보완할 점 / 느낀 점


  • 어렵지 않게 문제에 명시된대로 바로 구현할 수 있었으나, 장애물을 만났을 때의 처리를 제대로 고려하지 않아 입구컷을 당했었다.
  • 그후 게시판을 찾아봐서 장애물을 만났을 때도 고려해야된다는 사실을 알고 코드를 수정해 제출했다.
  • 문제가 난이도에 비해 다소 긴 느낌이 있어서 제대로 안읽고 구현한 감이 있었는데, 항상 문제를 꼼꼼히 읽는 습관을 들여야겠다.


참고자료


profile
안녕하세요
post-custom-banner

2개의 댓글

comment-user-thumbnail
2024년 5월 6일

잘 보고 갑니다~ :)

1개의 답글