Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
Tags
- 백준1463
- AI강의
- 9095
- 혁펜하임강의후기
- 백준
- CUDA
- C++ 함수
- C++
- for문
- c++ 기초
- tensorflow
- pytorch
- 1로만들기
- C++ 공백 입력
- 1463
- 백준9095
- 비교연산자
- 조건문
- 혁펜하임강의
- 패스트캠퍼스혁펜하임
- 혁펜하임AI
- 백준1026
- C++ 백준
- cuDNN
- 혁펜하임
- 패스트캠퍼스
- 반복문
- 백준C++
- precision
- AIDEEPDIVE
Archives
- Today
- Total
코딩하는 덕구 🐶
131. [삼성기출27]Python 백준 17837 번 새로운 게임 2 본문
728x90
안녕하세요 코딩하는 덕구입니다.
백준 17837 새로운 게임 2 입니다.
https://www.acmicpc.net/problem/17837
17837번: 새로운 게임 2
재현이는 주변을 살펴보던 중 체스판과 말을 이용해서 새로운 게임을 만들기로 했다. 새로운 게임은 크기가 N×N인 체스판에서 진행되고, 사용하는 말의 개수는 K개이다. 말은 원판모양이고, 하
www.acmicpc.net
백준 17837 새로운 게임 2 정답코드 입니다. 설명은 아래에 있습니다.
N, K = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(N)] #0 흰색, 1 빨간색, 2 파란색
stack_pieces = [[[] for _ in range(N)] for _ in range(N)]
chess_pieces = []
dx = [0, 0, -1, 1]
dy = [1, -1, 0, 0]
for i in range(K):
x, y, d = map(int, input().split())
x, y, d = x-1, y-1, d-1
stack_pieces[x][y].append(i)
chess_pieces.append([x, y, d])
def change_dir(d):
if d in [0, 2]:
return d + 1
return d - 1
def solve():
for turn in range(1, 1001):
for i in range(len(chess_pieces)):
x, y, d = chess_pieces[i]
nx, ny = dx[d] + x, dy[d] + y
if nx < 0 or ny < 0 or nx >= N or ny >= N or board[nx][ny] == 2: #만약 밖으로 나가거나 파란색
chess_pieces[i][2] = change_dir(d) #방향전환
d = chess_pieces[i][2]
nx, ny = dx[d] + x, dy[d] + y
if nx < 0 or ny < 0 or nx >= N or ny >= N or board[nx][ny] == 2: # 만약 밖으로 나가거나 파란색
continue
i_index = stack_pieces[x][y].index(i)
tmp = stack_pieces[x][y][i_index:]
stack_pieces[x][y] = stack_pieces[x][y][:i_index]
if board[nx][ny] == 0:
stack_pieces[nx][ny].extend(tmp)
elif board[nx][ny] == 1:
stack_pieces[nx][ny].extend(tmp[-1::-1])
for t in tmp:
chess_pieces[t][0], chess_pieces[t][1] = nx, ny
if len(stack_pieces[nx][ny]) >= 4:
return turn
return -1
print(solve())
문제 접근
단순한 구현문제 입니다. 말의 위치와 쌓여있는 말 들을 꼼꼼하게 추적하면 됩니다.
Python 코드 구현
먼저 보드판, 말들의 위치, 쌓여있는 말들의 정보를 저장합니다.
N, K = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(N)] #0 흰색, 1 빨간색, 2 파란색
stack_pieces = [[[] for _ in range(N)] for _ in range(N)]
chess_pieces = []
dx = [0, 0, -1, 1]
dy = [1, -1, 0, 0]
for i in range(K):
x, y, d = map(int, input().split())
x, y, d = x-1, y-1, d-1
stack_pieces[x][y].append(i)
chess_pieces.append([x, y, d])
방향을 바꾸는데 필요한 함수를 선언합니다.
def change_dir(d):
if d in [0, 2]:
return d + 1
return d - 1
1000번 동안 반복하며 체스말 1번부터 k까지 순서대로 이동합니다.
이때 말이 보드판 밖으로 나가거나 이동할 위치가 파란색이라면 방향을 바꿔주고,
새로운 곳으로 이동할 때 또 파란색이거나 보드판 밖이라면 더 이상 이동하지 않습니다.
def solve():
for turn in range(1, 1001):
for i in range(len(chess_pieces)):
x, y, d = chess_pieces[i]
nx, ny = dx[d] + x, dy[d] + y
if nx < 0 or ny < 0 or nx >= N or ny >= N or board[nx][ny] == 2: #만약 밖으로 나가거나 파란색
chess_pieces[i][2] = change_dir(d) #방향전환
d = chess_pieces[i][2]
nx, ny = dx[d] + x, dy[d] + y
if nx < 0 or ny < 0 or nx >= N or ny >= N or board[nx][ny] == 2: # 만약 밖으로 나가거나 파란색
continue
만약 이동할 위치가 흰색이라면 현재 움직이는 말 위에 있는 말들을 tmp에 저장,
움직이는 말 밑에 있는 말들만 놔두고 이동하여 새로운 위치에 쌓아 올립니다.
만약 빨간색이라면 뒤집어서 쌓아올립니다.
이후 새로운 말들의 위치를 업데이트 한 후
만약 쌓여있는 말이 4개가 넘는다면 해당 turn에 게임을 종료하고, 몇번째 turn인지 return 해줍니다.
i_index = stack_pieces[x][y].index(i)
tmp = stack_pieces[x][y][i_index:]
stack_pieces[x][y] = stack_pieces[x][y][:i_index]
if board[nx][ny] == 0:
stack_pieces[nx][ny].extend(tmp)
elif board[nx][ny] == 1:
stack_pieces[nx][ny].extend(tmp[-1::-1])
for t in tmp:
chess_pieces[t][0], chess_pieces[t][1] = nx, ny
if len(stack_pieces[nx][ny]) >= 4:
return turn
1000번 시도해서 끝나지 않는다면 -1을 return합니다.
return -1
print(solve())
백준 17837 새로운 게임 2 Python 코드였습니다.
감사합니다.
728x90
'알고리즘 문제 풀이' 카테고리의 다른 글
133. [삼성기출29]Python 백준 17825 번 주사위 윷놀이 (0) | 2023.07.08 |
---|---|
132. [삼성기출28]Python 백준 17822 번 원판 돌리기 (0) | 2023.07.04 |
130. [삼성기출26]Python 백준 17779 번 게리맨더링 2 (0) | 2023.06.26 |
129. [삼성기출25]Python 백준 17142 번 연구소 3 (0) | 2023.06.23 |
128. [삼성기출24]Python 백준 17140 번 이차원 배열과 연산 (0) | 2023.06.21 |