코테 탈출일지
[백준] 1652번: 누울 자리를 찾아라 - 파이썬/python 본문
https://www.acmicpc.net/problem/1652
1652번: 누울 자리를 찾아라
첫째 줄에 방의 크기 N이 주어진다. N은 1이상 100이하의 정수이다. 그 다음 N줄에 걸쳐 N개의 문자가 들어오는데 '.'은 아무것도 없는 곳을 의미하고, 'X'는 짐이 있는 곳을 의미한다.
www.acmicpc.net
접근 방식
- 이중 for문과 인덱싱 방식 고민
- count가 이루어지는 시점 고민
코드 풀이
n = int(input())
room = []
for _ in range(n):
tmp = list(input())
room.append(tmp)
row = 0
col = 0
for i in range(n):
tmpa, tmpb = 0, 0
for j in range(n):
if room[i][j] == '.':
tmpb += 1
else:
tmpb = 0 # 연속이 아니면 초기화
if tmpb == 2: # 연속이면 해당 row count (가로)
row += 1
if room[j][i] == '.':
tmpa += 1
else:
tmpa = 0 # 연속이 아니면 초기화
if tmpa == 2: # 연속이면 해당 col count (세로)
col += 1
print(row, col, end = ' ')
가로와 세로를 이중 for 문으로 탐색하며 연속인 경우가 발생하면 해당 row 및 col에 가로 및 세로로 누울 자리가 있음을 확인하면 되는 문제입니다. 같은 for문 안에서 가로와 세로를 동시에 탐색하므로 room[i][j]. room[j][i] 이렇게 순서를 바꾸어 진행하는 것이 핵심입니다.
오답 이유
- 가로로 누울 자리, 세로로 누울 자리를 세는 방식을 착각하여 오답이 발생했습니다. 예를 들어 가로에 연속으로 4개의 '.'이 있다면 2연속 자리 세 개가 아닌 하나의 누울 자리로 계산됩니다.
- 그리고 아래의 방식으로 오답 코드를 작성했는데, 이런 방식으로 코드를 작성하면 tmpa != 0, tmp != 0를 검사하는 시점과 i, j 순서대로 탐색하는 방식이 엇갈리게 됩니다. 즉 tmpb를 통해 col은 제대로 탐색되지만, tmpa는 가장 안쪽 for문에서 j 순환이 먼저 일어나므로 적절한 방식으로 검사되지 않습니다.
n = int(input())
room = []
for _ in range(n):
tmp = list(input())
room.append(tmp)
row = 0
col = 0
for i in range(n-1):
tmpa, tmpb = 0, 0
for j in range(n-1):
if room[i][j] == '.' and room[i+1][j] == '.':
tmpb += 1
if room[j][i] == '.' and room[j][i+1] == '.':
tmpa += 1
if tmpb != 0: col += 1
if tmpa != 0: row += 1
print(row, col, end = ' ')
메모
input으로 들어오는 문자열을 각각 하나로 원소로 하는 리스트로 받으려면 list_a = list(input()) 를 활용합니다 ex. list_a = ['h', 'a', 'p', 'p', 'y']
'구현' 카테고리의 다른 글
[백준] 2477번: 참외밭 - 파이썬/python (0) | 2023.07.20 |
---|---|
[백준] 1966번: 프린터 큐 - 파이썬/python (0) | 2023.07.18 |
[백준] 2669번: 직사각형 네개의 합집합의 면적 구하기 - 파이썬/python (0) | 2023.07.16 |
[백준] 1476번: 날짜 계산 - 파이썬/python (0) | 2023.07.16 |
[백준] 2740번: 행렬 곱셈 - 파이썬/python (0) | 2023.07.16 |