코딩테스트/SWEA

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

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

 

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

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

 

 

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

두 번째 줄 : 원본 암호문

세 번째 줄 : 명령어의 개수

네 번째 줄 : 명령어

 

 

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

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

3. A(추가) y, s : 암호문의 맨 뒤에 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 # 다음번 질의 인덱스 

        elif(ope=="A"):
            num = int(add[index+1]) # 덧붙일 암호문 개수
            original = original + add[index+3:index+num+3] # 덧붙여진 암호 문자열
            index += 2+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])))
 

 

 

 

[문제풀이]


 

swea 1229 문제랑 거의 동일하다.

추가로 A연산자만 구현해주면 끝!

 

이건 swea 1229 문제처럼 구분자가 여러개기 때문에 구분자를 기준으로 나눠 질의를 처리할 수 없다.

그래서 공백을 기준으로 몽땅 리스트화 했다.

['D', '137', '5', 'I', '65', '2', '638184', '744976', 'A', 2, '908760', '773951']
 

그리고 리스트에 있는 각 질의의 연산자와 삽입할 숫자 등 정보를 index 위치를 조정해서 찾는다.

 

이렇게 연산자 D의 경우엔 (연산자, 수행 위치, 삭제할 개수)의 정보만 주어진다.

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

 

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

index+삽입할 개수+3이 다음번 질의 시작 위치!

 

연산자 A의 경우엔 (연산자, 삽입할 개수)에다 삽입하는 암호문의 개수가 주어진다.

index+삽입할 개수+2이 다음번 질의 시작 위치!

 

이렇게 찾은 질의는 각 연산자의 행동에 맞게 적절한 처리를 해주면 끝!