코딩테스트/SWEA

[Python, 파이썬] SWEA 1229. [S/W 문제해결 기본] 8일차 - 암호문2

알코딩 2024. 11. 10. 13:32

2가지 명령어가 주어졌을 때, 모든 명령어를 수행하고 나온 결과의 암호문의 

처음 10자리의 숫자를 구하는 문제.

 

첫 번째 줄 : 원본 암호문의 길이

두 번째 줄 : 원본 암호문

세 번째 줄 : 명령어의 개수

네 번째 줄 : 명령어

 

 

1. I(삽입) x, y, s : 앞에서부터 x의 위치 바로 다음에 y개의 숫자를 삽입.

2. D(삭제) x, y : # 앞에서부터 x의 위치 바로 다음부터 y개의 숫자를 삭제.

 

 

T = 10 # 테스트케이스의 개수 T

for test_case in range(1, T+1):

    N = int(input()) # 원본 암호 길이
    original = input().split() # 원본 암호

    Q = int(input()) # 질의의 개수
    add = input().split() # 덧붙일 암호들

    index = 0 # 질의 시작 위치

    for p in range(Q):

        ope = add[index] # 연산자

        if(ope=="I"):
            loc, num = int(add[index+1]), int(add[index+2]) # 수행 위치, 삽입할 암호문 개수
            original = original[:loc] + add[index+3:index+num+3] + original[loc:] # 삽입된 암호 문자열
            index += 3+num # 다음번 질의 인덱스 

        else:
            loc, num = int(add[index+1]), int(add[index+2]) # 수행 위치, 삭제할 암호문 개수
            original = original[:loc] + original[loc+num:] # 삭제된 암호 문자열
            index += 3 # 다음번 질의 인덱스

    print("#%d %s" % (test_case, ' '.join(original[:10])))
 

 

 

 

[문제풀이]


 

D 137 5 D 70 5 D 24 1 I 65 8 638184 744976 908760 773951
 

위와 같은 질의가 들어왔다 하자.

이건 swea 1228 처럼 I를 기준으로 나눠 하나하나 질의를 처리하는 방법은 쓸 수 없다.

 

왜냐하면 구분자가 D와 I 둘 다고, 이걸 그냥 구분자로 나눠버린다면 각 질의가 뭘 연산해야 하는지 모르기 때문이다. 그래서 우선 공백을 기준으로 몽땅 리스트화 했다.

['D', '137', '5', 'D', '70', '5', 'D', '24', '1', 'I', '65', '8', '638184', 
'744976', '908760', '773951']
 

이러면 모든 질의가 섞여 있는데, 그 질의에는 연산자와 삽입할 숫자 등 정보가 있다.

그 정보를 바탕으로 index 위치를 조정해서 각 질의마다 시작 위치를 찾아 주었다.

 

 

이렇게 처음 위치를 index 0으로 둘 때, 연산자 D의 경우엔 (연산자, 수행 위치, 삭제할 개수)의 정보만 주어진다.

그럼 그 다음 질의의 시작 위치는 현재 위치에서 3칸 후므로 index+3!

 

 

연산자 I의 경우엔 (연산자, 수행 위치, 삽입할 개수)에다 삽입하는 암호문들까지 고려해야 한다.

다행히 이 정보는 삽입할 개수에 있으므로 삽입할 개수+3가 현재 질의에서 사용하는 정보므로 이걸 index에 더해줘서 다음번 질의를 찾으면 된다.

 

이렇게 찾은 질의는 내용에 맞게 적절한 처리를 해주면 끝!