728x90
# 접근 방법
- 이동 후 같은 칸에 2개 이상이 존재하는 경우 합치는 것이 문제 해결의 키포인트이다.
- 우선 벽에 부딪혔을 경우 방향을 반대로 해주기 편하게 di, dj = [1, 0, -1, 0]과 같이 인덱스 2 차이가 나도록 설정해준다.
- 입력받는 모든 구슬을 순서대로 marbles 리스트에 저장해주는데, 방향을 숫자로 변환해서 넣어준다.
- 또한 구슬이 이동하고 난 후의 위치를 저장할 location리스트를 빈 크기로 격자 크기와 동일하게 만들어 준다.
- move 함수
- 주어진 구슬들을 순회하면서 값이 존재한다면 주어진 방향을 더해준다.
- 만약 격자를 벗어난다면 (d+2) % 4를 통해 전환 후 location[현재 위치]에 인덱스를 넣어준다.
- 이동을 하였다면 현재 구슬의 정보를 업데이트 시켜주고 마찬가지로 location[현재 위치]에 인덱스를 넣어준다.
- remove 함수
- location에서 2이상인 좌표가 발견된다면, 내림차순으로 정렬해준다.
- 가장 큰 구슬의 방향을 가지므로 번호가 가장 큰 구슬 = 0번 인덱스를 제외하고는 val에 무게를 더해주고 리스트를 비워준다.
- 모든 값을 더한 후 0번 인덱스의 구슬 무게를 val로 변경해주면 된다.
def move():
location = [[[] for _ in range(N)] for _ in range(N)]
for i, m in enumerate(marbles):
if not m:
continue
si, sj, d, w = m
ni, nj = si+di[d], sj+dj[d]
if 0<=ni<N and 0<=nj<N:
si, sj = ni, nj
marbles[i] = [ni, nj, d, w]
else:
marbles[i] = [si, sj, (d+2)%4, w]
location[si][sj].append(i)
remove(location)
def remove(location):
for i in range(N):
for j in range(N):
if len(location[i][j]) >= 2:
temp = sorted(location[i][j], reverse=True)
val = marbles[temp[0]][3]
for t in range(1, len(temp)):
val += marbles[temp[t]][3]
marbles[temp[t]] = []
marbles[temp[0]][3] = val
N, M, T = map(int, input().split())
di, dj = [1, 0, -1, 0], [0, -1, 0, 1]
marbles = []
convert= {'L':1, 'R': 3, 'U':2, 'D':0}
for _ in range(M):
a, b, c, d = map(str, input().split())
marbles.append([int(a)-1, int(b)-1, convert[c], int(d)])
for _ in range(T):
move()
cnt, weight = 0, 0
for i in marbles:
if i:
cnt += 1
weight = max(weight, i[3])
print(cnt, weight)
728x90
'ALGORITHM > 정렬, 탐색,구현' 카테고리의 다른 글
[코드트리] 파이썬 - 나무박멸 (1) | 2023.10.12 |
---|---|
[코드트리] 파이썬 - 꼬리잡기 (1) | 2023.10.11 |
[코드트리] 파이썬 - 숫자가 가장 큰 인접한 곳으로 동시에 이동 (1) | 2023.10.10 |
[백준 17142번] 파이썬 - 연구소 3 (0) | 2023.10.09 |
[백준 5549번] 파이썬 - 행성 탐사 (0) | 2023.10.07 |