일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 구현
- 스택
- 알고리즘
- BFS
- 브루트포스
- Stack
- 새벽코딩
- 빅데이터
- 백준
- oracle
- 다이나믹프로그래밍
- dfs
- 배열
- BufferedReader
- Python
- 프로그래머스
- 탐색
- LIS
- 시뮬레이션
- Java
- Queue
- 백트래킹
- DP
- 문자열
- 다리 만들기
- 아스키코드
- HashMap
- 그리디
- SQL
- 완전탐색
- Today
- Total
새벽코딩
[백준] [1652] 누울 자리를 찾아라 본문
문제
일 년 동안 세계일주를 하던 영식이는 여행을 하다 너무 피곤해서 근처에 있는 코레스코 콘도에서 하룻밤 잠을 자기로 하고 방을 잡았다.
코레스코 콘도에 있는 방은 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 |