코테 탈출일지

[백준] 1652번: 누울 자리를 찾아라 - 파이썬/python 본문

구현

[백준] 1652번: 누울 자리를 찾아라 - 파이썬/python

히려이 2023. 7. 16. 12:42

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']