본문 바로가기

개발/알고리즘

[ 삼성 기출 / Python ] 청소년 상어

처음 틀린 풀이

from copy import deepcopy
 
dx = [(00), (-10), (-1-1), (0-1), (1-1), (10), (11), (01), (-11)]
 
shark = int(1e9)
 
 
def solved():
    fish_pos = [[00for _ in range(17)]
    data = [[[00for _ in range(4)] for _ in range(4)]
 
    for i in range(4):
        value = list(map(int, input().split()))
        cnt = 0
        for j in range(072):
            fish_pos[value[j]][0], fish_pos[value[j]][1= i, cnt
            data[i][cnt][0], data[i][cnt][1= value[j], value[j + 1]
            cnt += 1
 
    data[0][0][0= shark
    fish_move(fish_pos, data)
 
 
def fish_move(fish, data):
    for i in range(117):
        x, y = fish[i]
        # 방향 빼서 그 방향으로 이동.
 
        for j in range(9):
            nx, ny = dx[data[x][y][1]][0], dx[data[x][y][1]][1]
            if 0 <= nx < 4 and 0 <= ny < 4 and data[nx][ny][0!= shark:
                data[x][y], data[nx][ny] = data[nx][ny], data[x][y]
                print(data[x][y][0], data[nx][ny][0])
                fish[data[x][y][0]], fish[data[nx][ny][0]] = fish[data[nx][ny][0]], fish[data[x][y][0]]
 
 
def shark_move(shark_x, shark_y, data, fish, cnt):
    # 현재 좌표에서 이동 가능한것들 쭈우욱 뽑기.
    # 지금 내가 풀려고 하는 방식은 상어가 움직이는 것과 물고기가 움직이는 함수 두개로 나눈다.
    # 상어는 현재 방향으로 while문을 돌면서, 재귀를 도는 것이다.
    x, y = shark_x, shark_y
    fish_move()
 
    data[x][y][1]
 
 
 
 
solved()
 
cs


이 문제는 구현이 꼬이지 않게 하는 것이 중요한 문제이다.
풀이법을 생각해 내는 과정은 길지 않았지만, 구현이 조금 복잡했다.
이 문제를 풀면서 왜 삼성 기출을 풀라고 하는지 조금은 감이 왔다. 어제 카카오 인턴 코테를 봤는데, 느낌이 많이 비슷하다. 풀이법은 생각나지만, 구현하는 과정에서 머리가 복잡해진다.
이런 문제를 풀면서 연습하면 좋을 것 같다.


해석
처음 풀려고 했던 방식은
1. 물고기가 움직이는 함수
2. 상어가 움직이는 함수 ( 재귀로 구현)

1. 물고기가 움직이는 함수:
현재 물고기 번호에 해당하는 좌표를 저장하고 있는 list를 매개변수로 받는다.
물고기가 1번부터 16번까지 전부 자신의 방향대로 한칸씩 움직인다.

2. 상어가 움직이는 함수
상어가 자신의 방향으로 움직일 수 있는 좌표를 전부 재귀를 돌면서 실행한다.
하지만 이때 재귀호출 이전과 이후에 어떤 조치를 해줘야 하는지는 생각 못했다.