새벽코딩

[백준] [1652] 누울 자리를 찾아라 본문

알고리즘

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

J 코딩 2022. 11. 23. 03:21
반응형

문제

일 년 동안 세계일주를 하던 영식이는 여행을 하다 너무 피곤해서 근처에 있는 코레스코 콘도에서 하룻밤 잠을 자기로 하고 방을 잡았다.

코레스코 콘도에 있는 방은 NxN의 정사각형모양으로 생겼다. 방 안에는 옮길 수 없는 짐들이 이것저것 많이 있어서 영식이의 누울 자리를 차지하고 있었다. 영식이는 이 열악한 환경에서 누울 수 있는 자리를 찾아야 한다. 영식이가 누울 수 있는 자리에는 조건이 있다. 똑바로 연속해서 2칸 이상의 빈 칸이 존재하면 그 곳에 몸을 양 옆으로 쭉 뻗으면서 누울 수 있다. 가로로 누울 수도 있고 세로로 누울 수도 있다. 누울 때는 무조건 몸을 쭉 뻗기 때문에 반드시 벽이나 짐에 닿게 된다. (중간에 어정쩡하게 눕는 경우가 없다.)

만약 방의 구조가 위의 그림처럼 생겼다면, 가로로 누울 수 있는 자리는 5개이고, 세로로 누울 수 있는 자리는 4개 이다. 방의 크기 N과 방의 구조가 주어졌을 때, 가로로 누울 수 있는 자리와 세로로 누울 수 있는 자리의 수를 구하는 프로그램을 작성하시오.

입력

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

출력

첫째 줄에 가로로 누울 수 있는 자리와 세로로 누울 수 있는 자리의 개수를 출력한다.

예제 입력 1 복사

5
....X
..XX.
.....
.XX..
X....

예제 출력 1 복사

5 4

 

※풀이

 

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

public class Main {

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

		int N = Integer.parseInt(br.readLine());
		
		int w = 0;
		int h = 0;
		
		Character[][] arr = new Character[N][N];
		
		for(int i = 0; i < N; i++) {
			String str = br.readLine();
			for(int j = 0; j < N; j++) {
				arr[i][j] = str.charAt(j);
			}
		}
		
		for(int i = 0; i < N; i++) {
			int wCnt = 0, hCnt = 0;
			for(int j = 0; j < N; j++) {
				if(arr[i][j] == '.') {
					wCnt++;
				} 
				
				if(arr[i][j] == 'X' || j == N-1) {
					if(wCnt >= 2) w++;
					wCnt = 0;
				}
			}
			
			for(int k = 0; k < N; k++) {
				if(arr[k][i] == '.') {
					hCnt++;
				} 
				
				if(arr[k][i] == 'X' || k == N-1) {
					if(hCnt >= 2) h++;
					hCnt = 0;
				}
			}
		}
		System.out.println(w + " " + h);
		br.close();
	}
}

 

우선 문제를 보자마자 되게 쉬운 문제인데 정답률이 40퍼정도라서 조금 이상하다고 생각했었다.

풀어보니 이해가 됬다. 문제를 완전히 이해하지 못하면 틀릴 수 있는 문제이다.

 

문제 출제자의 의도인지는 모르겠지만 문제의 설명과 테스트케이스가 조금 불친절한 감이 있다.

 

처음에는 한줄에 길이가 몇 이든 누울줄 아는 공간이 한 곳이라고 생각하고 문제에 접근했다.

각 줄을 읽어 빈공간이 2개 이상이면 break문으로 빠져나가면서 시간을 단축하는 로직을 짰다.

 

하지만, 문제가 다음과 같이 주어졌을 때

 

    X      
      X    
           
  X        
      X    
          X

 

가로로 잘 수 있는 공간이 총 9공간이 된다.

 

이유는 짐을 경계로 왼쪽과 오른쪽은 완전히 다른 공간으로 생각되어지기 때문이다.

 

그래서 반복문을 진행하는동안 '.'의 개수를 세다가 'X'가 나왔을때 그동안 세었던 점의 개수가 2이상이면 총 공간의 개수를 1개씩 증가시켜주고 점의 개수를 0으로 초기화 하여 문제를 해결하였다.

 

조금 억울하게 문제를 틀렸지만, 다음부터는 문제를 풀기전에 좀 더 생각하고 접근해야겠다.

 

 

 

-새벽코딩-

반응형

'알고리즘' 카테고리의 다른 글

[백준] [2745] 진법 변환  (2) 2022.11.25
[백준] [6996] 애너그램  (0) 2022.11.24
[백준] [1159] 농구 게임  (0) 2022.11.23
[백준] [10798] 세로읽기  (0) 2022.11.22
[백준] [9251] LCS  (0) 2022.11.21
Comments