[문제풀이-백준] 17143. 낚시왕

Sjin·2021년 4월 29일
0

삼성 기출

목록 보기
5/20

풀이

구현 방법

  • 방향 정보

    • 주어진 방향 정보를 그대로 이용하여 수식을 세우기엔 복잡함
      • 수식을 세우기 쉽게 방향 정보를 변경
  • 낚시왕 이동

    • 열의 처음부터 마지막까지만 이동하면 되므로 for문 이용
  • 낚시

    • 해당 열에서 상어들 중 가장 윗 행의 상어를 잡음
  • 상어 이동

    • 이중 반복문을 이용하여 한칸씩 이동하려 했으나 좌표 계산이 꼬였음
      • 반복문 하나로 돌림
    • 원본 데이터를 바로 바꾸다가 꼬였음
      • ny,nx라는 임시 데이터 만듬
    • 한칸 이동시의 좌표가 범위 내인지 미리 알아봄
      • 범위 내이면 그대로 이동
      • 범위 밖이면 방향 바꿔서 다시 계산

개선 방안

  • 시간이 오래걸림
    • 상어가 있는 좌표를 찾을 때 매번 for문으로 돌려서 찾기 보다는 상어들만 있는 리스트를 따로 만들어볼 것

참고

  • 3차원 리스트를 구현할 때, 제일 안쪽부터 z, x,y축이다.

코드

def copy():
    for i in range(R):
        for j in range(C):
            if [temp_matrix[i][j][0], temp_matrix[i][j][1], temp_matrix[i][j][2]] != [0,0,0]:
                shark_matrix[i][j][0], shark_matrix[i][j][1], shark_matrix[i][j][2] = temp_matrix[i][j][0], temp_matrix[i][j][1], temp_matrix[i][j][2]
                temp_matrix[i][j][0], temp_matrix[i][j][1], temp_matrix[i][j][2] = 0, 0, 0

def catch(x):
    size = 0
    for y in range(R):
        s, d, z = shark_matrix[y][x][0], shark_matrix[y][x][1], shark_matrix[y][x][2]
        if [s,d,z] != [0,0,0]:
            size = z
            shark_matrix[y][x][0], shark_matrix[y][x][1], shark_matrix[y][x][2] = 0, 0, 0
            break
    return size

def move(y,x,v,dir,size):
    cnt = 0
    while cnt < v:
        ny = y + direct[dir][0]
        nx = x + direct[dir][1]
        if ny < 0 or ny >= R or nx < 0 or nx >= C:
            dir += 2
            dir %= 4
            ny = y + direct[dir][0]
            nx = x + direct[dir][1]
        y,x = ny,nx
        cnt += 1
    s,d,z = temp_matrix[y][x][0], temp_matrix[y][x][1], temp_matrix[y][x][2]
    if [s,d,z] == [0,0,0]:
        temp_matrix[y][x][0], temp_matrix[y][x][1], temp_matrix[y][x][2] = v, dir, size
    else:
        if size > z:
            temp_matrix[y][x][0], temp_matrix[y][x][1], temp_matrix[y][x][2] = v, dir, size

R,C,M = map(int,input().split())
direct = [(-1,0),(0,1),(1,0),(0,-1)]
shark_matrix = [[[0]*3 for i in range(C)] for j in range(R)]
sum = 0

for i in range(M):
    r,c,s,d,z = map(int,input().split())
    if d == 1: d = 0
    elif d == 3: d = 1
    elif d == 4: d = 3
    shark_matrix[r-1][c-1][0], shark_matrix[r-1][c-1][1], shark_matrix[r-1][c-1][2] = s, d, z

for here in range(C):
    temp_matrix = [[[0] * 3 for i in range(C)] for j in range(R)]
    sum += catch(here)
    for i in range(R):
        for j in range(C):
            s, d, z = shark_matrix[i][j][0], shark_matrix[i][j][1], shark_matrix[i][j][2]
            if [s,d,z] != [0,0,0]:
                move(i,j,s,d,z)
                shark_matrix[i][j][0], shark_matrix[i][j][1], shark_matrix[i][j][2] = 0, 0, 0
    copy()

print(sum)
profile
웹뷰 개발에 관심 많은 Front-end 개발자입니다.

0개의 댓글

관련 채용 정보