문제링크
https://www.acmicpc.net/problem/1652
문제
일 년 동안 세계일주를 하던 영식이는 여행을 하다 너무 피곤해서 근처에 있는 코레스코 콘도에서 하룻밤 잠을 자기로 하고 방을 잡았다.
코레스코 콘도에 있는 방은 NxN의 정사각형모양으로 생겼다. 방 안에는 옮길 수 없는 짐들이 이것저것 많이 있어서 영식이의 누울 자리를 차지하고 있었다. 영식이는 이 열악한 환경에서 누울 수 있는 자리를 찾아야 한다. 영식이가 누울 수 있는 자리에는 조건이 있다. 똑바로 연속해서 2칸 이상의 빈 칸이 존재하면 그 곳에 몸을 양 옆으로 쭉 뻗으면서 누울 수 있다. 가로로 누울 수도 있고 세로로 누울 수도 있다. 누울 때는 무조건 몸을 쭉 뻗기 때문에 반드시 벽이나 짐에 닿게 된다. (중간에 어정쩡하게 눕는 경우가 없다.)
만약 방의 구조가 위의 그림처럼 생겼다면, 가로로 누울 수 있는 자리는 5개이고, 세로로 누울 수 있는 자리는 4개 이다. 방의 크기 N과 방의 구조가 주어졌을 때, 가로로 누울 수 있는 자리와 세로로 누울 수 있는 자리의 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 방의 크기 N이 주어진다. N은 1이상 100이하의 정수이다. 그 다음 N줄에 걸쳐 N개의 문자가 들어오는데 '.'은 아무것도 없는 곳을 의미하고, 'X'는 짐이 있는 곳을 의미한다.
출력
첫째 줄에 가로로 누울 수 있는 자리와 세로로 누울 수 있는 자리의 개수를 출력한다.
해석
빈 공간 + 빈 공간 + 벽(짐) 으로 이루어진 공간을 가로와 세로에서 각각 찾아 개수를 세어주면 된다.
코드
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
#include <iostream>
#include <string>
using namespace std;
int main() {
int n;
char input;
cin >> n;
bool load[101][101] = { 0 };
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> input;
if (input == 'X') {
load[i][j] = true;
}
}
}
for (int i = 0; i < n; i++) {
load[i][n] = true;
load[n][i] = true;
}
int row = 0; // 가로에서 찾는 자리
int col = 0; // 세로에서 찾는 자리
for (int i = 0; i < n; i++) {
for (int j = 0; j < n - 1; j++) {
if (load[i][j] == false && load[i][j + 1] == false && load[i][j + 2] == true) {
row++;
}
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n - 1; j++) {
if (load[j][i] == false && load[j + 1][i] == false && load[j + 2][i] == true) {
col++;
}
}
}
cout << row << " " << col;
}
|
cs |
Memo
문제를 제대로 이해하지 못했고 단순히 연속으로 두 자리가 비어있는지만 탐색을 해서 틀렸다.
"무조건 몸을 쭉 뻗기 때문에 반드시 벽이나 짐에 닿게 된다."를 조건에 넣어주었어야 했다.