본문 바로가기

알고리즘 문제풀이

swea 2001. 파리 퇴치 Python

T = int(input())
for tc in range(1,T+1):
    N, M = list(map(int,input().split()))
    arr = [list(map(int,input().split())) for _ in range(N)]
    # print(arr)
    max_list = []
    for i in range(N-M+1):
        for j in range(N-M+1):
            max_v = 0
            for m in range(M):
                for n in range(M):
                    max_v += arr[i+m][j+n]
            max_list.append(max_v)
            # print(max_v)
    for k in max_list:
        if max_v < k:
            max_v = k
    print(f'#{tc} {max_v}')

더 짧게 만든 코드

T = int(input())
for tc in range(1,T+1):
    N,M = map(int,input().split()) # 5 2
    arr = [list(map(int,input().split())) for _ in range(N)]
    # print(arr)
    dij = [[0,1],[1,0],[0,0],[1,1]]
    max_v = 0
    for i in range(N-M+1):
        for j in range(N-M+1):
            sum_v = 0 # 한 좌표마다 초기화
            for x in range(M): # 0 1
                for y in range(M): # 0 1
                    sum_v += arr[i+x][j+y]
            if max_v < sum_v:  # 최대 값 비교
                max_v = sum_v
    print(f'#{tc} {max_v}')

실수 한 점

  1. max_list 의 위치를 잘 조정해야 했다.max_list에 들어갈 누적된max_v들은 한 테스트가 전부 다 돌아가고 나서 호출해야지, 모든 결과값이 들어가 있다. -> 한 테스트가 시작 되는 지점에서 초기화해줌, -> append는 한 지점(i,j)에서 범위만큼 파리를 잡고 난 후 다음 지점(i+1,k)로 이동하기 전max_list에 추가
  2. 4방향 탐색이 가능하지 않을까 하면서 풀어봄
    결론 : 더욱 복잡해서 해당 알고리즘은 유망하지 않다.
    만약 M =3 이라서 3x3 의 공간을 파리퇴치할 때
    (3,2) 와 (2,3)을 접근할 방법에 어려움을 느꼈음
T = int(input())
for tc in range(1,T+1):
    N,M = map(int,input().split()) # 5 2
    arr = [list(map(int,input().split())) for _ in range(N)]
    # print(arr)
    dij = [[0,1],[1,0],[0,0],[1,1]]
    max_v = 0
    for i in range(N-M+1):
        for j in range(N-M+1):
            sum_v = 0 # 한 좌표마다 초기화
            for p in range(1,M): # 0
                for k in range(4):
                    ni = i + dij[k][0] 
                    nj = j + dij[k][1] 
                    sum_v += arr[ni+p][nj+p]
            if max_v < sum_v:  # 최대 값 비교
                max_v = sum_v
    print(max_v)