파이썬 알고리즘

[파이썬] SWEA 11718 사냥꾼

뜻 지, 깨달음 오 2022. 10. 25. 07:20

https://swexpertacademy.com/main/talk/solvingClub/problemView.do?contestProbId=AXhJSn_anL8DFAWQ&solveclubId=AYN4vh0aVUUDFAUs&problemBoxTitle=IM%EB%AC%B8%EC%A0%9C&problemBoxCnt=12&probBoxId=AYN5PuYKXHUDFAUs 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

    N = int(input())
    arr = [list(map(int, input().split())) for _ in range(N)]
    total_kills = 0
    #상하좌우 및 대각선 8방향
    dy = [-1, -1, -1, 0, 0, 1, 1, 1]
    dx = [-1, 0, 1, -1, 1, -1, 0, 1]
 
    for i in range(N):
        for j in range(N):
            if arr[i][j]==1: #사냥꾼이면은
                hunt(i, j)
 
    print(f'#{tc} {total_kills}')

2차원 배열을 돌면서 사냥꾼을 자주치면,

hunt라는 함수를 실행한다.

 

그리고 hunt에서는

사냥꾼이 쏠 수 있는 방향은 위, 아래, 좌, 우, 대각선 위, 아래, 좌, 우 해서 8가지 방향이다.

이렇게 쏘면서 돌이나 벽을 만나면 stop,

토끼를 만나면 cnt +=1 하고 계속 하기

 

    def hunt(y, x):
        global total_kills
 
        for i in range(8): #먼저 쏠 방향 정하고
            j = 1
            while True: #일직선으로 끝까지 쏘기
                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]==3:
                    #범위 벗어나거나 벽 만나면
                    break
 
                if arr[ny][nx]==0:
                    #빈공간이면은 계속 쏘기
                    j+=1
 
                if arr[ny][nx]==2:
                    #토끼 만나면 죽이고 계속 쏘기
                    total_kills +=1
                    j += 1

 

 

 

전체 코드)

T = int(input())
 
for tc in range(1, T+1):
 
    def hunt(y, x):
        global total_kills
 
        for i in range(8): #먼저 쏠 방향 정하고
            j = 1
            while True: #일직선으로 끝까지 쏘기
                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]==3:
                    #범위 벗어나거나 벽 만나면
                    break
 
                if arr[ny][nx]==0:
                    #빈공간이면은 계속 쏘기
                    j+=1
 
                if arr[ny][nx]==2:
                    #토끼 만나면 죽이고 계속 쏘기
                    total_kills +=1
                    j += 1
 
    N = int(input())
    arr = [list(map(int, input().split())) for _ in range(N)]
    total_kills = 0
    #상하좌우 및 대각선 8방향
    dy = [-1, -1, -1, 0, 0, 1, 1, 1]
    dx = [-1, 0, 1, -1, 1, -1, 0, 1]
 
    for i in range(N):
        for j in range(N):
            if arr[i][j]==1: #사냥꾼이면은
                hunt(i, j)
 
    print(f'#{tc} {total_kills}')