본문 바로가기
Algorithm Problem Solving/BaekJoon

[BaekJoon] 백준 3023 마술사 이민혁 (Python / 파이썬)

by ʚ⇜❅🎕̈❄⇝ɞ 2021. 8. 23.
728x90
반응형

BaekJoon 백준 3023 마술사 이민혁 문제는 카드 뒷 면 왼쪽 위 1/4만 디자인한다. 대칭시켜 오른쪽 위를 만들고, 다시 대칭시켜 아래 부분을 만든다. 마술 하는 데 사용하기 위한 의도된 에러를 넣는다. 카드 뒷 면 전체 디자인을 구하는 문제이다. 난이도는 Bronze 1이다.

 

BaekJoon 3023 마술사 이민혁 문제 정보

출처

- https://www.acmicpc.net/problem/3023

알고리즘 분류

- 문자열 string, 구현

난이도

- 브론즈 1 / Bronze 1

 

마술사 이민혁 문제 요약

  • 민혁이는 카드 뒷 면 전체를 디자인하지 않고, 왼쪽 위 1/4만 디자인한다. 그다음 대칭시켜 오른쪽 위를 만들고, 다시 대칭시켜서 아래 부분을 모두 만든다.
  • 이렇게 대칭시켜서 전체를 디자인 한 이후에는, 마술 하는 데 사용하기 위한 의도된 에러를 넣는다. 에러는 원래 '#'이어야 하는 칸을 '.'로 바꾸거나 '.'이어야 하는 칸을 '#'로 바꾸는 것이다.
  • 왼쪽 위의 디자인과 에러의 위치가 주어졌을 때, 카드 뒷 면 전체 디자인을 구하여 출력한다.
  • 왼쪽 위 부분의 행의 개수 R과 열의 개수 C가 주어진다. (1 ≤ R, C ≤ 50)
  • 에러의 위치 A와 B가 주어진다. (1 ≤ A ≤ 2R, 1 ≤ B ≤ 2C)

 

문제 풀이 과정

  1. 입력받은 왼쪽 위 부분의 디자인을 대칭시켜 오른쪽 위 부분을 완성한다.
  2. 윗부분을 대칭시켜 아래 부분을 완성한다.
  3. 이때 윗부분 행들을 단순히 아래 부분에 추가하면 일반 복사가 되어 에러 표시를 하면 윗부분과 아랫부분이 함께 바뀐다.
  4. 따라서 윗부분 행들을 copy.deepcopy를 사용하여 깊은 복사 하여 아래 부분에 추가해야 한다.
  5. 카드 뒷면의 모든 디자인을 완성했으므로 에러 위치를 찾아서 #은.으로,. 은 #으로 바꾼다.
  6. 카드 뒷 면 전체 디자인을 출력한다.

 

일반 복사 - 주소 값을 복사하는 것으로, 주소가 같으므로, 하나의 값을 변경하면 나머지 하나도 같이 변경된다.

얕은 복사 - 메모리 값을 복사한 것으로, 주소도 다르다. 하지만, 2차원 리스트의 경우 껍데기만 메모리가 2개인 것이다.

L [0]을 바꾸면 하나의 값만 바뀌지만, L [0][1]을 바꾸면 나머지 하나도 같이 변경된다.

깊은 복사 - 껍데기뿐 아니라 내부의 값까지 모두 복사되어 내부까지 메모리 값과 주소가 다르다. 따라서 어떤 값을 바꿔도 따로 바뀐다.

 

코드 및 설명
import copy

R, C = map(int, input().split())

card = []
for _ in range(R):
    card.append(list(input()))

A, B = map(int, input().split())

# 오른쪽 위 부분 대칭
for i in range(R):
    row = []
    for j in range(C - 1, -1, -1):
        row.append(card[i][j])
    card[i].extend(row)

# 아래 부분 대칭
for i in range(R - 1, -1, -1):
    row = copy.deepcopy(card[i])  # 깊은 복사
    card.append(row)

# 에러 처리
if card[A - 1][B - 1] == '#':
    card[A - 1][B - 1] = '.'
else:
    card[A - 1][B - 1] = '#'

for c in card:
    print(''.join(c))

python에서 어떤 상황에서 값이 같이 바뀌고 안 바뀌는지 몰랐는데, 깊은 복사, 얕은 복사에 대한 개념이었다. 자세히 공부해봐야겠다.

 

BaekJoon 백준 3023 마술사 이민혁 문제를 파이썬 python으로 풀어보았다. 난이도는 Bronze 브론즈 1이다. 

728x90
반응형

댓글