반응형

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())
= []
= [[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())
= []
for r in range(R):
    a = sys.stdin.readline().strip()
    b += [a + a[::-1]]
+= 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]을 바로 바꾸지 못하고

행 전체를 바꿔 입력해준다.

반응형

+ Recent posts