알고리즘/인프런: 파이썬 알고리즘 문제풀이

탐색&시뮬레이션 문제 #8. 곳감 (모래시계)

bearbrick 2022. 5. 31. 18:39

*이 풀이는 인프런: 파이썬 알고리즘 문제풀이 강좌에 기반하였습니다.

 

 

 

내 풀이

 

1. 회전 명령어를 입력받고, 행을 회전시키기 위해서 참고해야할 행이 있어야하므로, tmp배열에 arr배열의 num행을 깊은 복사를 한다.

(이 때, 얕은 복사를 하게 되면 tmp배열도 변경된다. 따라서 무조건 깊은 복사를 해주어 tmp배열이 변경되지 않도록 해서 원래의 값을 유지할 수 있도록 한다.) 

 

2. 왼쪽으로 num만큼 이동 = 오른쪽으로 n-num만큼 이동과 같은 뜻이므로, 왼쪽으로 이동하는 경우에는 num = n - num을 해주어 오른쪽으로 이동하는 경우로 만들어준다.

(ex. 5*5배열인 경우, 왼쪽으로 3만큼 이동 = 오른쪽으로 2만큼 이동)

 

3. 오른쪽으로 이동하는 경우, tmp[ i ]에 있는 값을 arr[ i + num ]으로 이동시켜주면 된다. 이때, 나머지 연산자를 통해 i + num이 인덱스 범위를 넘어가지 않도록 해준다.

 

4. 값을 회전시킨 후, 모래시계 모양에 해당하는 값의 합을 구해주면 되는데, 정 가운데 값을 기준으로 규칙이 있기 때문에 정가운데를 기준으로 해서 합을 구해나간다.

 

import sys
import copy
#sys.stdin=open("input.txt","rt")

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

for _ in range(m):
    row,dir,num=map(int,input().split())
    tmp=copy.deepcopy(arr[row-1])
    if dir==0:
        num=n-num
    for i in range(n):
        arr[row-1][(i+num)%n]=tmp[i]
    
middle=n//2
sum=arr[middle][middle]

for i in range(1,middle+1):
    for j in range(middle-i,middle+i+1):
        sum+=arr[middle-i][j]
        sum+=arr[middle+i][j]

print(sum)

 

 

 

강사님 풀이

 

import sys
sys.stdin=open("input.txt","rt")

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

for i in range(m):
    h, t, k = map(int, input().split())
    if t==0:
        for _ in range(k):
            a[h-1].append(a[h-1].pop(0))
    else:
        for _ in range(k):
            a[h-1].insert(0, a[h-1].pop())

s,e=0,n-1
res=0
for i in range(n):
    for j in range(s,e+1):
        res+=a[i][j]
    if i<n//2:
        s+=1
        e-=1
    else:
        s-=1
        e+=1
print(res)

 

 

 

배운 점

 

1. 얕은 복사 vs 깊은 복사

얕은 복사와 깊은 복사에 대해서 알아보기 전에, immutable한 객체와 mutable한 객체에 대해서 알아야 한다.

 

immutable한 객체란 변경되지 않는 객체를 뜻한다. 즉 객체의 상태를 변경할 수 없다.

immutable한 객체의 종류로는 int, float, tuple, str, bool 이 있다.

 

mutable한 객체란 변경되는 객체를 뜻한다. 즉, 객체의 상태를 변경할 수 있다.

mutable한 객체의 종류로는 list, set, dictionary 가 있다.

 

이 mutable한 객체는 객체를 변경할 수 있기 때문에, 얕은복사와 깊은 복사를 할 수 있다.

 

 

 

얕은 복사란 주소값을 복사하는 것으로, 같은 주소를 가리키고 있는 경우이다.

 

 

깊은 복사란 실제 값을 새로운 메모리 공간에 복사하는 것으로, 다른 주소를 가리키고 있는 경우이다.

 

 

이러한 얕은 복사와 깊은 복사를 코드로 알아보면 아래와 같다.

 

import copy
# immutable한 객체
a=1
b=a
print(b) # 1 출력
a=2
print(b) # 1 출력

# mutable한 객체
#얕은 복사
a=[1,2,3]
b=a
print(b) # [1, 2, 3] 출력
a.append(4)
print(b) # [1, 2, 3, 4] 출력

#깊은 복사
c=[1,2,3]
d=copy.deepcopy(c)
print(d) # [1, 2, 3] 출력
c.append(4)
print(d) # [1, 2, 3] 출력

 

mutable한 객체의 얕은 복사는 ' = ' 연산자를 통해 할 수 있고, 깊은 복사는 import copy를 한 후, copy.deepcopy( 배열 ) 를 사용해서 할 수 있다.

 

2. 리스트 내장함수 insert( a, b ) : a번째 인덱스에 b값을 삽입