본문 바로가기
  • 살짝 구운 김 유나
Algorithm/SWEA

SWEA_13976_기지국

by yunae 2022. 8. 28.

SS 텔레콤에서 현재 기지국의 위치와 집들이 표시된 지도를 2차원 nxn 배열로 변환하여, 기지국에 커버 되지 않는 집의 수를 찾고자 한다. 기지국은 [그림1]과 같이 세가지 종류가 있다. 각각의 기지국은 기지국이 위치한 셀에서 동서남북으로 각 1개, 2개, 3개의 셀을 커버하며, 하나의 집은 1개의 셀에 있다. 




문제

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

 

제약사항

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

 


입력

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

 

출력

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

 

해결방법

- 언제나 처럼,, 델타 쓰기 이제 델타 장인

 

코드

# 기지국 타입에 따라서 커버하는 거리가 다르다
cover = {'A': 1, 'B': 2, 'C': 3}

# 상하좌우 네 방향
d = [[0, 1], [0, -1], [1, 0], [-1, 0]]

T = int(input())

for test_case in range(1, T+1):
    N = int(input())

    # 문제에서는 N*N 이라고 했으면서 입력은 N*(N+1);;
    arr = [list(input()) for _ in range(N+1)]

    for i in range(N+1):
        for j in range(N):
            # 조회한 원소가 기지국이면
            if arr[i][j] in ['A', 'B', 'C']:
                for di, dj in d:
                    # 타입에 따른 거리만큼 커버하자. 이때는 'H' >> 'X'로 변경
                    k = 1
                    while k <= cover[arr[i][j]]:
                        if 0 <= i+di*k < N+1 and 0 <= j+dj*k < N and arr[i+di*k][j+dj*k] == 'H':
                            arr[i+di*k][j+dj*k] = 'X'
                        k += 1

   # 커버되지 않은 가구수 카운트하기
    ans = 0
    for i in range(N+1):
        for j in range(N):
            if arr[i][j] == 'H':
                ans += 1
    print(f'#{test_case} {ans}')

 

 

언제부턴가 능소화만 보이면 카메라를 들이미는 이모가 되어버렸다.

원래는 노랑 튤립이었는데, 이젠 누가 제일 좋아하는 꽃이 뭐냐고 물으면 능소화라고 답할 것 같아.

 

댓글