출처: www.acmicpc.net/problem/1652
누울 자리를 찾아라 성공분류
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞은 사람 | 정답 비율 |
2 초 | 128 MB | 10230 | 4029 | 3359 | 40.715% |
문제
일 년 동안 세계일주를 하던 영식이는 여행을 하다 너무 피곤해서 근처에 있는 코레스코 콘도에서 하룻밤 잠을 자기로 하고 방을 잡았다.
코레스코 콘도에 있는 방은 NxN의 정사각형모양으로 생겼다. 방 안에는 옮길 수 없는 짐들이 이것저것 많이 있어서 영식이의 누울 자리를 차지하고 있었다. 영식이는 이 열악한 환경에서 누울 수 있는 자리를 찾아야 한다. 영식이가 누울 수 있는 자리에는 조건이 있다. 똑바로 연속해서 2칸 이상의 빈 칸이 존재하면 그 곳에 몸을 양 옆으로 쭉 뻗으면서 누울 수 있다. 가로로 누울 수도 있고 세로로 누울 수도 있다. 누울 때는 무조건 몸을 쭉 뻗기 때문에 반드시 벽이나 짐에 닿게 된다. (중간에 어정쩡하게 눕는 경우가 없다.)
만약 방의 구조가 위의 그림처럼 생겼다면, 가로로 누울 수 있는 자리는 5개이고, 세로로 누울 수 있는 자리는 4개 이다. 방의 크기 N과 방의 구조가 주어졌을 때, 가로로 누울 수 있는 자리와 세로로 누울 수 있는 자리의 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 방의 크기 N이 주어진다. N은 1이상 100이하의 정수이다. 그 다음 N줄에 걸쳐 N개의 문자가 들어오는데 '.'은 아무것도 없는 곳을 의미하고, 'X'는 짐이 있는 곳을 의미한다.
출력
첫째 줄에 가로로 누울 수 있는 자리와 세로로 누울 수 있는 자리의 개수를 출력한다.
예제 입력 1
5
....X
..XX.
.....
.XX..
X....
예제 출력 1
5 4
문제를 보면 사람이 방 안에서 자야하는 상황이고, 방 크기는 NXN의 정사각형 모양으로 생겼다. 사람이 누울 자리를 찾아야 하는데 연속해서 2칸이상의 빈 칸이 존재하는 곳에 누울 수 있다. 사람은 방에 가로로 누울 수 있고, 세로로도 누울 수 있다.
중간에 물건이 있는 경우나 벽에 닿게 되어 2칸 미만이 되는 경우는 포함하지 않는다.
위의 예시를 보면 검정색으로 칠해진 면적이 물건이 있는 부분이다. 따라서 그 부분을 제외하고 2칸 이상이 연속된 공간들을 찾아내야한다. 첫번째 행을보면 끝에만 검정색으로 칠해져있고 그 전에는 4개의 연속된 공간이 있다. 이 경우 가로로 누울 수 있는 공간이 1개 있는 것이다. 그 다음 행을 보면 3, 4번째 칸이 검정색으로 칠해져있다. 이 경우에는 잘 수 있는 공간이 있는가? 그렇다. 1, 2번째 칸이 비어 있으므로 가로로 누울 수 있는 공간이 하나 더 늘어난 것이다. 이런 식으로 계산해보면 예제 출력 결과와 같이 가로로 누울 수 있는 자리는 총 5개고 세로도 이와 같이 계산하여 총 4개가 나온다.
위에서 문제에 대해 이해한 방향과 같게 소스코드를 작성하니 비교적 쉽게 해결되었다.
가로로 누울 수 있는 자리보다 세로로 누울 수 있는 자리를 계산하는 것이 개인적으로 더 어려웠다고 느꼈다.
처음에는 아래 코드를 Run을 해주었더니 다음과 같은 오류가 나타났다.
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 | N=int(input()) setting=[] row=0 #행 col=0 #열 cnt_w=0 cnt_h=0 for i in range(N): setting.append(input()) for i in setting: for j in i: if j=='.': row+=1 else: if row>=2: cnt_w+=1 row=0 if row>1: cnt_w+=1 row=0 for i in range(N): for j in range(N): if setting[j][i] == '.': col += 1 else: if col > 1: cnt_h += 1 col = 0 if col>1: cnt_h += 1 col = 0 print(cnt_w, cnt_h) | cs |
Indentation Error는 들여쓰기 오류이다. 파이썬에는 들여쓰기가 굉장히 중요한데 중첩적인 for문이나 if문을 쓸 때, 특히나 주의해주어야 한다. 소스코드의 29번째 줄에서 오류가 발생한것을 확인할 수 있었다. 확인 후, 코드를 수정해주었다.
미세한 차이이지만 수정해줌으로써 문제없이 실행되었다.
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 | N=int(input()) setting=[] row=0 #행 col=0 #열 cnt_w=0 cnt_h=0 for i in range(N): setting.append(input()) for i in setting: for j in i: if j=='.': row+=1 else: if row>=2: cnt_w+=1 row=0 if row>1: cnt_w+=1 row=0 for i in range(N): for j in range(N): if setting[j][i] == '.': col += 1 else: if col > 1: cnt_h += 1 col = 0 if col>1: cnt_h += 1 col = 0 print(cnt_w, cnt_h) | cs |
파이썬 문법 Error에 좀 더 민감하게 반응해야겠다고 느낄 수 있었던 실습이었다.
'Baekjoon Online' 카테고리의 다른 글
[python] 백준 2941번_크로아티아 알파벳 (0) | 2021.01.13 |
---|---|
[C++] 백준 2839번_설탕 배달 (0) | 2021.01.12 |
[python] 백준 1019번_책 페이지 (0) | 2021.01.10 |
[python] 백준 1935번_후위 표기식2 (0) | 2021.01.09 |
[C] 백준 2562번_최댓값 (0) | 2021.01.08 |