Skip to content
CatBus
Go back

[BOJ] 누울 자리를 찾아라 - 1652 (S5)

시간 제한메모리 제한
2 초128 MB

문제

일정한 간격으로 벽이 설치되어 있는 방이 있다. 이 방의 크기는 N×N이며 일부 칸에는 사람들이 이미 누워있다.

방은 다음과 같이 주어진다.

이때, 연속해서 2칸 이상의 빈 칸이 있으면 그 곳에 누울 수 있다. 가로로 누울 수 있는 자리와 세로로 누울 수 있는 자리의 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 방의 크기 N이 주어진다. (1 ≤ N ≤ 100)

둘째 줄부터 N개의 줄에 방의 정보가 주어진다. 방의 정보는 .X로만 이루어져 있다.

출력

첫째 줄에 가로로 누울 수 있는 자리의 개수와 세로로 누울 수 있는 자리의 개수를 공백으로 구분하여 출력한다.

풀이

이 문제는 2차원 배열에서 연속된 빈 공간을 세는 문제이다.

접근 방법

핵심 아이디어

  1. 각 행을 순회하며 연속된 .의 개수를 센다
  2. 연속된 빈 칸이 2개 이상이면 가로로 누울 자리 1개로 카운트
  3. 세로는 배열을 transpose(전치)하여 같은 방법 적용

누울 자리 판별

코드

def get_area_cnt(room, N):
    row_cnt = 0

    for y in range(N):
        cnt = 0
        for x in range(N):
            # print(room[y][x], end=" ")
            if room[y][x] == "X":
                if cnt >= 2:
                    row_cnt += 1
                cnt = 0
                continue
            cnt += 1
        if cnt >= 2:
            row_cnt += 1
    return row_cnt


def main():
    N = int(input())

    room = [input() for _ in range(N)]
    print(get_area_cnt(room, N), end=" ")

    room = list(zip(*room))
    print(get_area_cnt(room, N))


if __name__ == "__main__":
    main()

코드 설명

get_area_cnt 함수

def get_area_cnt(room, N):
    row_cnt = 0

    for y in range(N):
        cnt = 0
        for x in range(N):
            if room[y][x] == "X":
                if cnt >= 2:
                    row_cnt += 1
                cnt = 0
                continue
            cnt += 1
        if cnt >= 2:
            row_cnt += 1
    return row_cnt

메인 로직

room = [input() for _ in range(N)]
print(get_area_cnt(room, N), end=" ")

room = list(zip(*room))
print(get_area_cnt(room, N))

가로 누울 자리:

세로 누울 자리:

배열 전치 이해하기

room = ['..X',
        '.X.',
        'X..']

# zip(*room) 결과
transposed = [('.', '.', 'X'),  # 첫 번째 열
              ('.', 'X', '.'),  # 두 번째 열
              ('X', '.', '.')]  # 세 번째 열

전치를 하면 열이 행으로 바뀌므로, 세로 방향 확인을 가로 방향 확인과 동일한 로직으로 처리할 수 있다.

시간 복잡도

N ≤ 100이므로 최대 10,000번의 연산으로 충분히 빠르다.

예제 분석

N = 5
방:
....X
....X
.XX..
.XX..
X....

가로 누울 자리:

세로 누울 자리:

주의 사항

  1. 연속 2칸 이상: 정확히 2칸이 아니라 2칸 이상
  2. 행의 끝 처리: 마지막 칸이 빈 칸이면 행이 끝났을 때도 카운트 확인
  3. 전치 활용: 세로 검사를 위해 배열 전치 사용
  4. 출력 형식: 가로와 세로를 공백으로 구분

다른 접근 방법

정규표현식을 사용할 수도 있다:

import re

N = int(input())
room = [input() for _ in range(N)]

# 가로
row_cnt = sum(len(re.findall(r'\.{2,}', row)) for row in room)

# 세로
transposed = [''.join(row[i] for row in room) for i in range(N)]
col_cnt = sum(len(re.findall(r'\.{2,}', col)) for col in transposed)

print(row_cnt, col_cnt)

정규표현식 \.{2,}는 “연속된 2개 이상의 .”을 의미한다.


Share this post:

비슷한 글

1652이 글

본문을 Xenova/multilingual-e5-small 로 임베딩하고, 그 벡터를 PCA 로 32축에 눌러 왼쪽 막대로 그렸습니다. 비슷한 글은 지문도 닮습니다 — 위아래를 견줘 보세요. 계산은 빌드 때 끝나고 벡터는 브라우저로 오지 않습니다.

Previous Post
[BOJ] 숨바꼭질 3 - 13549 (G5)
Next Post
[BOJ] 거짓말 - 1043 (G4)