반응형
3023
https://www.acmicpc.net/problem/3023
3023번: 마술사 이민혁
첫째 줄에 왼쪽 위 부분의 행의 개수 R과 열의 개수 C가 주어진다. (1 ≤ R, C ≤ 50) 다음 R개 줄에는 C개의 문자 '.' 또는 '#'가 주어진다. 마지막 줄에는 에러의 위치 A와 B가 주어진다. (1 ≤ A ≤ 2R, 1
www.acmicpc.net
[정답1]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
import sys
R, C = map(int, sys.stdin.readline().split())
a = []
b = [[0 for j in range(2*C)] for i in range(2*R)]
for r in range(R):
a.append(sys.stdin.readline().strip())
for i in range(R):
for j in range(C):
b[i][j] = a[i][j]
for i in range(R):
for j in range(C, 2*C):
b[i][j] = b[i][2*C-j-1]
for i in range(R, 2*R):
for j in range(2*C):
b[i][j] = b[2*R-i-1][j]
A, B = map(int, sys.stdin.readline().split())
if b[A-1][B-1] == '#':
b[A-1][B-1] = '.'
else:
b[A-1][B-1] = '#'
for r in range(2*R):
for c in range(2*C):
print(b[r][c], end = '')
print()
|
cs |
.
.
.
[풀이]
for문을 통해서 기본, 오른쪽 대칭, 위아래 대칭순으로 각각 해주었다.
for문을 여러번 써서 지저분해보인다.
슬라이싱을 이용한 방법을 알아보았다.
[정답2]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
import sys
R, C = map(int, sys.stdin.readline().split())
b = []
for r in range(R):
a = sys.stdin.readline().strip()
b += [a + a[::-1]]
b += b[::-1]
A, B = map(int, sys.stdin.readline().split())
if b[A-1][B-1] == '#':
b[A-1] = b[A-1][:B-1] + '.' + b[A-1][B:]
else:
b[A-1] = b[A-1][:B-1] + '#' + b[A-1][B:]
for r in range(2*R):
print(b[r])
|
cs |
훨씬 깔끔해졌다.
처음 입력을 받음과 동시에 오른쪽 대칭(+a[::-1])을 추가해준다.
오른쪽 대칭을 한 상태에서 위아래 대칭이 곧 원점 대칭과 같음을 이용하여
b의 역순(+b[::-1])을 추가해준다.
에러 추가는 b[A-1]의 type이 str이기 때문에 b[A-1][B-1]을 바로 바꾸지 못하고
행 전체를 바꿔 입력해준다.
반응형
'백준 문제풀이' 카테고리의 다른 글
[백준 2755] 파이썬 : 이번학기 평점은 몇점? (0) | 2021.09.28 |
---|---|
[백준 9625] 파이썬 : BABBA (0) | 2021.09.28 |
[백준 10988] 파이썬 : 팰린드롬인지 확인하기 (0) | 2021.09.26 |
[백준 1834] 파이썬 : 나머지와 몫이 같은 수 (0) | 2021.09.25 |
각오 (0) | 2021.09.25 |