12733. 기지국

2023. 8. 28. 09:28·swea

SS 텔레콤에서 현재 기지국의 위치와 집들이 표시된 지도를 2차원 nxn 배열로 변환하여, 기지국에 커버 되지 않는 집의 수를 찾고자 한다.

기지국은 [그림1]과 같이 세가지 종류가 있다. 각각의 기지국은 기지국이 위치한 셀에서 동서남북으로 각 1개, 2개, 3개의 셀을 커버하며, 하나의 집은 1개의 셀에 있다. 


주어진 2차원 배열 지도에 위치한 기지국으로 커버되지 않는 집의 수를 찾는 프로그램을 작성하시오.

 

[제약사항]

2차원 배열의 크기의 n은 50이하이다. 기지국의 수는 50이하이다.

 

[입력]

첫 줄에는 테스트 케이스의 수가 주어지고, 그 다음 줄부터 각 테스트 케이스가 n개의 줄로 구성된다. 테스트 케이스의 첫 줄에는 n이 주어지고, 다음 n개 줄에는 2차원 배열의 각 행이 한 줄에 차례로 주어진다. 단, 집이 위치한 원소는 ‘H’, 기지국이 위치한 원소는 ‘A’, ‘B’, ‘C’로 표시하며, 각각 동서남북으로 1, 2, 3개를 커버하는 기지국이다. ‘X’인 원소는 아무 것도 없다는 것을 나타낸다.

 

[출력]

각 줄은 ‘#x’로 시작하고 공백을 하나 둔 다음, 테스트 케이스에 주어진 기지국에 cover가 되지 않는 집의 수를 출력한다. 단, x는 테스트 케이스 번호이다.

 

 

입력
2
9
XXXXXXXXX
XXXHXXXXX
XXHAHXXHX
XXHHXXXXX
XXXXXXXXX
XXAHHXXXX
XXHXXHAHX
XXAHXXHXX
XXHXHXXXX
9
XXXHXXXXX
XXXHXXXXX
XXHCHXHHX
XXHHXXHXX
XXXHXHBHH
XHAHHXXXX
XXHXXXHXX
XXAHXHAHX
XXHXHXXXX
 
출력
#1 4
#2 4
T = int(input())
for tc in range(1,T+1):
    n = int(input())
    arr = [list(input()) for _ in range(n)]
    cnt = 0
 
    for i in range(n):
        for j in range(n):
            if arr[i][j] == 'A':
                for di, dj in [(1,0), (0,1), (-1,0), (0,-1)]:
                    if 0<= i+di < n and 0<= j+dj < n:
                        if arr[i+di][j+dj] == 'H':  # 범위 내 집이 있으면
                             arr[i+di][j+dj] = 'X'  # X로 변경
    for i in range(n):
        for j in range(n):
            if arr[i][j] == 'B':
                for k in range(1,3):
                    for di, dj in [(1,0), (0,1), (-1,0), (0,-1)]:
                        if 0<= i+di*k < n and 0<= j+dj*k < n:
                            if arr[i+di*k][j+dj*k] == 'H':
                                arr[i+di*k][j+dj*k] = 'X'
    for i in range(n):
        for j in range(n):
            if arr[i][j] == 'C':
                for k in range(1,4):
                    for di, dj in [(1,0), (0,1), (-1,0), (0,-1)]:
                        if 0<= i+di*k < n and 0<= j+dj*k < n:
                            if arr[i+di*k][j+dj*k] == 'H':
                                arr[i+di*k][j+dj*k] = 'X'  
    for i in range(n):
        for j in range(n):
            if arr[i][j] == 'H':  # 범위를 벗어나 X로 바뀌지 못한 집이 있으면 
                cnt += 1  
    print(f'#{tc} {cnt}')
저작자표시 (새창열림)

'swea' 카테고리의 다른 글

9367. 점점 커지는 당근의 개수  (0) 2023.08.28
11315. 오목 판정  (0) 2023.08.28
13732. 정사각형 판정  (0) 2023.08.28
18575. 풍선팡 보너스 게임  (0) 2023.08.28
1873. 상호의 배틀필드  (0) 2023.08.27
'swea' 카테고리의 다른 글
  • 9367. 점점 커지는 당근의 개수
  • 11315. 오목 판정
  • 13732. 정사각형 판정
  • 18575. 풍선팡 보너스 게임
버그잡는고양이발
버그잡는고양이발
주니어 개발자입니다!
  • 버그잡는고양이발
    지극히평범한개발블로그
    버그잡는고양이발
  • 전체
    오늘
    어제
    • 분류 전체보기 (381)
      • React (16)
      • Next.js (5)
      • Javascript (5)
      • Typescript (4)
      • Node.js (2)
      • Cs (16)
      • 트러블 슈팅 (5)
      • Html (1)
      • Css (3)
      • Django (0)
      • vue (0)
      • Java (1)
      • Python (0)
      • 독서 (1)
      • 기타 (3)
      • 백준 (192)
      • swea (31)
      • 프로그래머스 (30)
      • 이코테 (4)
      • 99클럽 코테 스터디 (30)
      • ssafy (31)
      • IT기사 (1)
  • 블로그 메뉴

    • 홈
    • 태그
  • 인기 글

  • 태그

    개발자취업
    항해99
    Til
    코딩테스트준비
    99클럽
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
버그잡는고양이발
12733. 기지국
상단으로

티스토리툴바