알고리즘/백준 문제풀이

[삼성SW역량][Python/BOJ] 백준 17143 낚시왕_구현

개발자 덕구🐾 2022. 8. 10. 20:35
728x90

 

딱히 어렵다고 생각되지는 않았다. 

상어가 벽에 충돌할 때 구현하는 법만 안다면 쉬운 문제였으나 그 방법을 생각 못했다.

따로 수학공식이 있을 것이라 생각하고 계속 생각해보려고 했는데 못찾았다.

답을 찾아보니 간단하게 방향만 바꿔주고 가야할 길이를 줄이지 않으면 해결되는 것이었다.

이 문제를 통해 배웠으니 다른 문제에서 만나면 사용하자.

 

 

추가로 문제가 분명히 맞는데 자꾸 틀리다라고 떠서 한참을 봤다. 

그 이유는 처음 입력받은 r,c를 상어 위치하면서 똑같은 변수에 r,c를 받아서 다른 값으로  변경되었었기 때문이다. 

입력받는 변수이름을 주의하자. 

 


 

 

1,2,3,4가 상 하 우 좌이다. 

이를 0부터 시작하도록 변경하여 그리면 

 

 

그림판에 그린거라..삐뚤빼뚤

이렇다.

 

0과 2의 경우 반대 방향으로 가려면 1을 더하면 되고

1과 3의 경우 반대 방향으로 가려면 1을 빼면 된다.

 

 

 

 

원래 이차원 배열1= 이차원배열2 이렇게 하면 이차원 배열 2의 값들이 이차원 배열1의 값으로  잘 복사되었는데 이 문제에서는 에러가 발생한다. 각각의 요소가 리스트로 된 이차원 배열을 이렇게 copy가 안되나보다. 

 

 


1~4를 열의 길이만큼 반복한다. 

1. 오른쪽으로  한칸 움직이기

2. 낚시왕 열에서 땅과 가까운 상어를 잡는다.

3. 각각의 상어가 이동한다. 

4. 한 칸에 여러마리가 있다면 가장 큰 상어를 제외하고는 없앤다. 

 

 

 

코드 : 

# 상 하 우 좌 
dx = [-1,1,0,0]
dy = [0,0,1,-1]


# 상어 이동 
def move_shark() :
    new = [[[] for i in range(c)] for j in range(r)]
    for i in range(r) :
        for j in range(c) :
            if shark[i][j] :
                x,y = i,j
                s,d,z = shark[x][y][0]
                dist = s 
                while dist > 0 :
                    nx,ny = x + dx[d],y + dy[d]
                    # 벽과 충돌하지 않은 경우 
                    if 0<=nx<r and 0<=ny<c :
                        x,y = nx,ny 
                        dist -=1 
                    # 벽과 충돌한 경우 
                    else :
                        # 상 or 우 
                        if d == 0 or d == 2 :
                            d +=1 
                        elif d==1 or d == 3 :
                            d-=1 
                new[x][y].append([s,d,z])
    for i in range(r) :
        for j in range(c) :
            shark[i][j] = new[i][j]
            
            
            
# 상어 잡기  
def catch_shark() :
    global answer 
    
    # 낚시왕이 열을 돌아다니면서 
    for king in range(c) :
        # 땅과 가까운 곳을 확인 
        for x in range(r) :
            # 상어가 있다면 
            if shark[x][king] :
                s,d,z = shark[x][king].pop(0)
                answer+=z
                break 
            
        # 상어 움직이기 
        move_shark()
        
        # 한 곳에 상어가 여러마리 있는 경우 처리 
        for i in range(r) :
            for j in range(c) :
                # 상어가 2마리 이상 있는 경우 
                if len(shark[i][j])>1 :
                    shark[i][j].sort(key = lambda x : x[2], reverse = True)
                    while len(shark[i][j])>1 :
                        shark[i][j].pop()
                

if __name__=="__main__" :
    r,c,m = map(int,input().split())
    shark = [[[] for i in range(c)] for j in range(r)]
    for _ in range(m) :
        R,C,s,d,z = map(int,input().split())
        shark[R-1][C-1].append([s,d-1,z])
    
    answer = 0
    catch_shark()
    print(answer)

 

 

참고 블로그 :

https://heytech.tistory.com/378

 

[알고리즘] 백준#17143: 낚시왕/Python

📝 문제 https://www.acmicpc.net/problem/17143 17143번: 낚시왕 낚시왕이 상어 낚시를 하는 곳은 크기가 R×C인 격자판으로 나타낼 수 있다. 격자판의 각 칸은 (r, c)로 나타낼 수 있다. r은 행, c는 열이고, (R..

heytech.tistory.com

 

 

 

반응형