Python/CoTe

[CodingTest]나무 타이쿤 - 삼성기출문제 (파이썬)

joannekim0420 2024. 4. 13. 01:26
728x90

 

정말 어려운 것은 아니지만 하나하나 체크하고 신경 쓸게 많은 구현 문제...

정답률 70% 이상인 것으로 보아 어렵진 않다. 

 

문제 예시대로, 

1.영양제 이동

2. 이동된 영양제 위치 나무 길이 +1씩

3. 영양제가 있는 나무 기준 대각선을 순회하면서 길이가 1 이상인 개수 곳의 개수만큼 지금 나무 길이 +

4. 길이가 2 이상인 나무 자르고, 자른 나무의 위치가 새롭게 영양제를 주는 곳으로 표시

 

이 것을 반복하면 된다. 

n,m = map(int, input().split())

trees = [list(map(int, input().split())) for _ in range(n)]
moves = [list(map(int, input().split())) for _ in range(m)]

move_dir = {1:(0,1),2:(-1,1),3:(-1,0),4:(-1,-1),5:(0,-1),6:(1,-1),7:(1,0),8:(1,1)}

med = [(n-1,0),(n-1,1),(n-2,0),(n-2,1)]    

for d,k in moves:
    di, dj = move_dir[d]
    check = []
    # 영양제 이동
    for i,j in med:
        if 0<= i+di*k<n:
            i += di*k
        elif i+di*k<0:
            i = i+di*k+n
        else:
            i = i+di*k-n
        if 0<= j+dj*k <n:
            j += dj*k
        elif j+dj*k<0:
            j = j+dj*k+n
        else:
            j = j+dj*k-n
        check.append((i,j))
    
    #영양제가 있는 곳 나무 길이 +1
    for ci,cj in check:
        trees[ci][cj] += 1
    
    #대각선만큼 개수만큼 현재 나무 길이 +
    for ci, cj in check:
        count = 0
        for ni,nj in [(-1,-1), (1,-1),(-1,1),(1,1)]:
            if 0<= ci+ni<n and 0<=cj+nj<n and trees[ci+ni][cj+nj] > 0:
                count += 1
        trees[ci][cj] += count

    #크기 2이상 나무 자르기
    med = []
    for i in range(n):
        for j in range(n):
            if (i,j) not in check and trees[i][j] >= 2:
                trees[i][j] -= 2
                med.append((i,j))    

answer = 0
for i in range(n):
    for j in range(n):
        answer += trees[i][j]

print(answer)