2010 정보올림피아드 초등부 마지막 문제이다.
문제 풀이
1. A부터 순서대로 k개의 알파벳의 배열을 만든다.
2. ?로 시작하는 사다리가 나올 때 까지 1에서 만든 배열을 주어진 사다리에 따라 바꾸어 나간다.
3. ?로 시작하는 사다리를 만나면 그 이후의 사다리들을 배열에 넣고 뒤집어 준다.
4. 정답 배열을 3의 배열에서 순서대로 꺼내며 사다리에 맞게 정답 배열을 바꾸어 나간다.(3에서 뒤집에 주었으므로 정답 배열은 가장 밑의 사다리부터 따라가게 된다.)
5. 1의 배열과 4의 배열을 비교하여 적절한 사다리 모양을 만든다.
Python Code
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
import string, sys
al = string.ascii_uppercase
k=int(sys.stdin.readline())
n=int(sys.stdin.readline())
al = list(al[:k])
answer = list(sys.stdin.readline()[:-1])
def swap(i):
temp = al[i]
al[i] = al[i+1]
al[i+1] = temp
def swap2(i):
temp = answer[i]
answer[i] = answer[i+1]
answer[i+1] = temp
for i in range(n):
ladder = sys.stdin.readline().split()[0]
if ladder[0] == "?":
break
else:
for idx,l in enumerate(ladder):
if l =="-":
swap(idx)
rest = [sys.stdin.readline().split()[0] for _ in range(i+1,n)]
rest.reverse()
for ladder in rest:
for idx,l in enumerate(ladder):
if l =="-":
swap2(idx)
ans = ""
for i in range(k-1):
if al[i] == answer[i]:
ans += "*"
elif al[i] == answer[i+1] and al[i+1]==answer[i] and (i==0 or ans[-1] == "*"):
ans += "-"
swap(i)
else:
ans = "x" * (k-1)
break
print(ans)
|
cs |
line 5의 al이 과정 1의 배열이다.
line 6의 answer가 과정4의 정답 배열이다.
swap 함수는 al을 사다리에 따라 바꿔주며, swap2는 answer를 바꿔준다.
line 17의 for 문이 과정 2이며, line26의 rest배열이 과정 3의 ?이후의 사다리 배열이다.
line 28의 for 문이 과정 4이다.
line 34가 마지막 과정 5 이다.
37 line의 마지막 조건의 경우, 사다리가 연속으로 이어진 경우는 없다는 조건을 구현한 것이다.
문제 링크
2469번: 사다리 타기
첫 줄에는 참가한 사람의 수 k가 나온다(3≤k≤26). 그 다음 줄에는 가로 막대가 놓일 전체 가로 줄의 수를 나타내는 n이 나온다(3≤n≤1,000). 그리고 세 번째 줄에는 사다리를 타고 난 후 결정된 참가자들의 최종 순서가 길이 k인 대문자 문자열로 들어온다. k와 n, 그리고 도착순서 문자열이 나타난 다음, 이어지는 n개의 줄에는 앞서 설명한 바와 같이 ‘*’와 ‘-’ 문자로 이루어진 길이 k-1인 문자열이 주어진다. 그 중 감추어진 가로 줄
www.acmicpc.net
'알고리즘 > 백준' 카테고리의 다른 글
백준 2559 수열 (0) | 2020.03.23 |
---|---|
백준 1058 친구 (0) | 2020.03.19 |
백준 2468 안전 영역 (0) | 2020.03.17 |
백준 2467 용액 (0) | 2020.03.12 |
백준 1300 K번째 수 (0) | 2020.03.11 |