coding test - python/SAMSUNG SWT(SW역량 테스트)
삼성 SW역량테스트 기출 / 2018 하반기 오전 2번 문제 토스트 계란들 - BFS / Python 파이썬
sillon
2024. 9. 17. 00:42
728x90
반응형
*문제 출처는 삼성전자, 코드트리에 있습니다.
삼멘 3일차
문제 제목: 토스트 계란들 - BFS
코드트리 | 코딩테스트 준비를 위한 알고리즘 정석
국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.
www.codetree.ai
나의 풀이
- 입력 받기:
- 격자의 크기 n, 계란 차이 범위 L과 R을 입력받는다.
- 격자에서 각 칸의 계란 수를 입력받아 maps에 저장한다.
- BFS 함수 정의:
- 주어진 시작 위치에서 BFS를 실행하여 계란 차이가 L 이상 R 이하인 인접 칸을 탐색한다.
- 탐색한 칸의 계란을 평균으로 업데이트한다.
- BFS가 실행된 후 계란 변화 여부를 반환한다.
- 주 반복문:
- 모든 칸을 순회하면서 방문하지 않은 칸에서 BFS를 수행한다.
- BFS 후에 계란이 변화한 경우 state를 True로 설정하고, 이동 횟수를 증가시킨다.
- 계란 변화가 없는 경우 반복을 종료한다.
- 결과 출력:
- 계란 이동 횟수를 출력한다.
나의 풀이
from collections import deque
n, L, R = map(int, input().split())
maps = [list(map(int, input().split())) for _ in range(n)]
answer = 0
def BFS(start, visited):
queue = deque(start)
sum_ = []
while queue:
q = queue.popleft()
qx, qy = q[0], q[1]
direct = [(1, 0), (-1, 0), (0, 1), (0, -1)]
for i in range(4):
xx = qx + direct[i][0]
yy = qy + direct[i][1]
if 0 <= xx < n and 0 <= yy < n and not visited[xx][yy]:
if L <= abs(maps[qx][qy] - maps[xx][yy]) <= R:
queue.append([xx, yy])
visited[xx][yy] = True
sum_.append([xx, yy])
if len(sum_) > 1:
value = sum(maps[i[0]][i[1]] for i in sum_) // len(sum_)
for i in sum_:
maps[i[0]][i[1]] = value
return visited, True
else:
return visited, False
while True:
state = False
visited = [[False] * n for _ in range(n)]
for i in range(n):
for j in range(n):
if not visited[i][j]:
visited, state_ = BFS([[i, j]], visited)
state = state or state_ ## 둘 중 True가 있으면 True 반환
if not state:
break
answer += 1
print(answer)
2차원 배열의 깊은 복사와 얕은 복사 설명:
- 얕은 복사 (Shallow Copy):
- 정의: 배열의 구조만 복사하고, 내부 객체(리스트 등)에 대한 참조만 복사함.
- 결과: 복사된 배열과 원본 배열이 같은 내부 객체를 참조하므로, 내부 객체의 변경이 원본 배열에도 영향을 미침.
- 깊은 복사 (Deep Copy):
- 정의: 배열의 구조와 내부 객체 모두를 새로 복사함.
- 결과: 복사된 배열과 원본 배열이 서로 독립적이므로, 하나의 배열에서 변경을 해도 다른 배열에는 영향을 미치지 않음.
예제 코드와 설명:
# 원본 2차원 배열
maps = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]
얕은 복사 예제:
shallow_copy = maps # 얕은 복사
shallow_copy[0][0] = 10
# 결과: shallow_copy와 maps 모두 [10, 2, 3]으로 변경됨
깊은 복사 예제:
import copy
deep_copy = copy.deepcopy(maps) # 깊은 복사
deep_copy[0][0] = 10
# 결과: deep_copy는 [10, 2, 3]으로 변경되지만, maps는 여전히 [1, 2, 3]으로 남음
- 얕은 복사:
- shallow_copy는 maps와 같은 객체를 참조함.
- 내부의 값이 변경되면 maps에도 영향을 미침.
shallow_copy = maps
- 깊은 복사:
- deep_copy는 maps의 모든 값과 구조를 새로 복사함.
- deep_copy의 변경은 maps에 영향을 미치지 않음.
deep_copy = copy.deepcopy(maps)
※ 알아야 할 것
- 2차원 배열을 그냥 .copy() 하면 얕은 복사가 되므로, 깊은 복사를 할거면 [[maps[i][j] for j in range(n)] for i in range(n)] 이런식으로 배열 복사를 진행해야 주소값까지 복사되지않음
- copy.deepcopy() 매소드도 있었는데 그냥 한줄코딩으로 하는게 나은듯
- state = state or state_ (둘중 하나가 참이면 참을 출력하는 or 연산자 자주 쓰자!)
728x90
반응형