파이썬 알고리즘

[파이썬] SWEA 11671 기지국

뜻 지, 깨달음 오 2022. 10. 31. 17:46

 

 

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}')