A, B, C 기지국 별로 상하좌우로 해당 기지국이 배정된 길이만큼 가면서 H를 바꿔주는 문제이다.
나는 X, H, A, B, C 가 아닌 제 3의 글자 (L)으로 바꿨다.
j가 증가하면서
벽에 만났을때,
다른 기지국을 만났을 때
를 제외하고는 다 L로 바꿔주게끔 코드를 짰다.
def wifi_reach(y, x, distance):
dy = [-1, 1, 0, 0]
dx = [0, 0, -1, 1]
for i in range(4):
j = 1
while j<=distance:
ny = y+dy[i]*j
nx = x+dx[i]*j
if ny<0 or nx<0 or ny>N-1 or nx>N-1 or arr[ny][nx] == 'A' or arr[ny][nx] == 'B' or arr[ny][nx] == 'C':
break
arr[ny][nx] = 'L'
j+= 1
2중 for문을 돌면서 기지국을 만나면 함수에 넣는다.+
for tc in range(1, 1+T):
N = int(input())
arr = [list(input()) for _ in range(N)]
for i in range(N):
for j in range(N):
if arr[i][j] == 'A':
wifi_reach(i, j, 1)
elif arr[i][j] == 'B':
wifi_reach(i, j, 2)
elif arr[i][j]=='C':
wifi_reach(i, j, 3)
마지막은 2중 for문으로 배열을 돌면서 아직 H가 안바뀐 집들의 숫자를 세어준다.
cnt = 0
for i in range(N):
for j in range(N):
if arr[i][j] == 'H':
cnt += 1
print(f'#{tc} {cnt}')
전체 풀이)
def wifi_reach(y, x, distance):
dy = [-1, 1, 0, 0]
dx = [0, 0, -1, 1]
for i in range(4):
j = 1
while j<=distance:
ny = y+dy[i]*j
nx = x+dx[i]*j
if ny<0 or nx<0 or ny>N-1 or nx>N-1 or arr[ny][nx] == 'A' or arr[ny][nx] == 'B' or arr[ny][nx] == 'C':
break
arr[ny][nx] = 'L'
j+= 1
T = int(input())
for tc in range(1, 1+T):
N = int(input())
arr = [list(input()) for _ in range(N)]
for i in range(N):
for j in range(N):
if arr[i][j] == 'A':
wifi_reach(i, j, 1)
elif arr[i][j] == 'B':
wifi_reach(i, j, 2)
elif arr[i][j]=='C':
wifi_reach(i, j, 3)
# print(arr)
cnt = 0
for i in range(N):
for j in range(N):
if arr[i][j] == 'H':
cnt += 1
print(f'#{tc} {cnt}')
'파이썬 알고리즘' 카테고리의 다른 글
SWEA 1208 Flatten (0) | 2022.10.31 |
---|---|
[파이썬] SWEA 4408 자기 방으로 돌아가기 (0) | 2022.10.31 |
[파이썬] 백준 1475번 방 번호 (0) | 2022.10.31 |
[파이썬] 백준 6603 로또 (0) | 2022.10.31 |
[파이썬] SWEA 11315 오목판정 (0) | 2022.10.25 |