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