본문 바로가기

개발/알고리즘

[BOJ] 안전 영역_2468

 

 

이 문제는 푸는 생각을 하는데 까지 15분도 걸리지 않은 것 같다. 어떻게 풀어야 할지 머리로 먼저 생각하였고, 결과적으론 그 생각이 바로 맞았었다.

몇일 전까지만 해도 전혀 감이 안잡혔는데 생각보다 빨리 문제에 대한 감이 생기는 것 같다.

 

하지만 문제를 풀고 제출하는데 까지는 시간이 1시간도 넘게 걸렸다.

그 이유는 파이썬에 대한 몇가지 몰랐던 문법과 작은 실수들 때문이였다.

 

파이썬 문법 몰랐던 것

단순 객체복제

data = [1]

data2 = data

data2[0] = 2

이렇게 한다면 data2는 data변수를 단순히 복사한 것이기 때문에 둘다 가르키는 방향이 동일하다.

그러므로 data2의 값을 바꾸면 가르키는 객체의 내용이 바뀌는 것이기 때문에 둘다 값이 동일하게 바뀐다.

 

깊은 복사와 얕은 복사

 

얕은 복사는 data2 = copy.copy(data)로 얕은 복사를 할 수 있다.

얕은 복사는 복합객체는 새로운 객체로 복사하지만, 내부객체는 동일한 객체를 참조한다.

무슨 뜻이냐하면, data = [1, [2, 3, 4]]은 복합객체이고  [[2, 3, 4]]는 내부객체이다.

따라서 data2[0] = 100을 하면 data의 첫 번째 값도 바뀌지 않지만, 복합객체를 변경하는 것은 둘다 바뀐다.

 

깊은 복사는 data2 = copy.deepcopy(data)로 깊은 복사를 할 수 있다.

이것은 내부객체든 복합객체든 모두 새로운 객체로 복사하기 때문에 서로 영향을 주지 않는다.

 

data = [0, 1, 3]

data2 = data

얕은 복사는 위와 같이 data2를 data가 가르키는 방향과 동일하게 하는 것이다.

즉, data2[0] = 3으로 값을 바꾸면 data[0]의 값도 바뀌는 것이다. 

 

2차원 배열에서 최대값 구하는 방법

 

max(map(max, data))하면 이차원 배열에서 최대 값을 구할 수 있다.

1차원 배열에서는 max(data)이다.

 

 

몇 가지 실수들

 

암기된 bfs를 가져다 쓰려고 하다보니 변수명에 대한 실수가 자꾸 나온다.

암기된 내용을 쓰는 것은 좋지만, 현재 쓰고 있는 부분이 어떤 기능을 하는 것이고 왜 필요한 것인지는

적어도 생각하고 써야한다.

 

 

'개발 > 알고리즘' 카테고리의 다른 글

[BOJ] 촌수계산_2644  (0) 2021.01.03
[BOJ] 알파벳_1987  (0) 2021.01.02
[BOJ] 영역 구하기_2583  (0) 2021.01.01
[BOJ] 유기농 배추_1012  (0) 2020.12.27
[BOJ] 1697 숨바꼭질  (0) 2020.12.27