이 문제는 우선 처음에 문제자체를 이해하는것도 조금 어려웠다!
전에 올린문제중에 진공청소기 문제가 있었는데, 거기서 dy dc 를 사용했던 기억이 나서 그렇게 풀어보려고 한 다음에, 각 말들이 순서에맞게 방향대로 움직이고, 빨간벽,파란벽에 따라 기능을 달리하는거까지는 수행했는데, 이 말이 위로 올라탄 상태 즉, 윷놀이처럼 '업는다'라는 개념을 어떻게 도입해야할지 막막해서 그만뒀다. 확실히 아직 실전 코딩테스트를 풀기에는 실력이 부족하지 않은가 싶다. 한시간정도 고민했는데 못푸는 문제들을 우수수 보니 아직도 많이 부족하구나 싶으면서도 빨리 코딩실력을 키워서 다 풀어버리고싶다. 코테 준비는 확실히 다른 공부에 비해 즐겁다.
본론으로 돌아와서 '말을 업는다' 라는 개념을 도입하기 위해서 이 체스맵과 똑같은 맵을 만드는데, 그 안에 업혀있는지를 나타내는 배열이 필요했다. 즉, 2차원 배열로 나와있는 맵에서 그 위치에 말이 어떻게 업혀있는지 나타내기 위해 3중배열을 사용하는 것이다.
[
[ [] , [] , [0,1] , [] ],
[ [] , [2] , [] , [] ],
[ [] , [3] , [] , [] ],
[ [] , [] , [] , [] ],
]
위그림같은 느낌인 것이다. 그리고 업혀있는것또한 업힌 순서에 따라 위에있는 말들만 이동하는데, tv프로그램 더지니어스에 나온 달리기게임과 유사했다. (강시,구미호 이런거 3개씩 뽑는거였는데 이름이 기억이 잘안난다..) 이 기능을 구현하기 위해서 저 3차원배열의 마지막 배열에 스택형식으로 쌓는 방식을 택했다.
k = 4 # 말의 개수
chess_map = [
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]
]
start_horse_location_and_directions = [
[0, 0, 0],
[0, 1, 0],
[0, 2, 0],
[2, 2, 2]
]
# 이 경우는 게임이 끝나지 않아 -1 을 반환해야 합니다!
# 동 서 북 남
# →, ←, ↑, ↓
dr = [0, 0, -1, 1]
dc = [1, -1, 0, 0]
def get_d_index_when_go_back(d):
if d % 2 ==0:
return d+1
else:
return d-1
def get_game_over_turn_count(horse_count, game_map, horse_location_and_directions):
n = len(chess_map)
current_stacked_horse_map = [[[] for _ in range(n) ] for _ in range(n)]
for i in range(horse_count):
r,c,d = horse_location_and_directions[i]
current_stacked_horse_map[r][c].append(i)
turn_count = 1
while turn_count <=1000: #턴을 기준
for horse_index in range(horse_count):
r,c,d = horse_location_and_directions[horse_index]
new_r = r + dr[d]
new_c = c + dc[d]
#파란색이거나 맵을 나갔을 때
if not 0 <= new_r < n or not 0 <= new_c < n or game_map[new_r][new_c] ==2:
new_d = get_d_index_when_go_back(d)
horse_location_and_directions[horse_index][2] = new_d
new_r = r + dr[new_d]
new_c = c + dc[new_d]
if not 0 <= new_r < n or not 0 <= new_c < n or game_map[new_r][new_c] == 2:
continue
moving_horse_index_array = []
for i in range(len(current_stacked_horse_map[r][c])): #말을 꺼냄
current_stacked_horse_index = current_stacked_horse_map[r][c][i]
if horse_index == current_stacked_horse_index:
moving_horse_index_array = current_stacked_horse_map[r][c][i:]
current_stacked_horse_map[r][c] = current_stacked_horse_map[r][c][:i]
break
if game_map[new_r][new_c] == 1:
moving_horse_index_array = reversed(moving_horse_index_array)
for moving_horse_index in moving_horse_index_array:
current_stacked_horse_map[new_r][new_c].append(moving_horse_index)
horse_location_and_directions[moving_horse_index][0] = new_r
horse_location_and_directions[moving_horse_index][1] = new_c
if len(current_stacked_horse_map[new_r][new_c]) >=4:
return turn_count
turn_count +=1
return -1
print(current_stacked_horse_map)
return
print(get_game_over_turn_count(k, chess_map, start_horse_location_and_directions)) # 2가 반환 되어야합니다
코드가 꽤 복잡해 보일 수 있는데 천천히 따라가다보면 이해하는건 어렵지 않았다.
내 목표는 약 1년후쯤에 코테를 보게 되는 것이겠지만, 이해하는게 아니라 충분히 모두 구현할 정도로 실력을 빨리 기르고 싶다는 생각을 하게 되었다.
'Python > 알고리즘공부' 카테고리의 다른 글
10_삼성역량테스트3 (0) | 2021.11.08 |
---|---|
09_구슬게임 (0) | 2021.11.08 |
07_올바른 괄호 문자열 만들기_카카오 문제 (0) | 2021.11.05 |
06_문자열 압축 (0) | 2021.11.05 |
05_catchme 문제! ( 상반기 line인턴채용문제) (1) | 2021.11.05 |