개발 공부용

1229. [S/W 문제해결 기본] 8일차 - 암호문2 본문

코딩 테스트

1229. [S/W 문제해결 기본] 8일차 - 암호문2

솝제로 2025. 11. 10. 11:42
문제

 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

1. I(삽입) x, y, s : 앞에서부터 x의 위치 바로 다음에 y개의 숫자를 삽입한다. s는 덧붙일 숫자들이다.[ ex) I 3 2 123152 487651 ]

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

 

위와 같은 명령을 처리하는 프로그램을 작성하시오.

 

입력
  • 10개의 테스트 케이스로 구성
  • 각각의  테스트 케이스는 아래와 같다.
  • 첫 번째 줄 : 원본 암호문의 길이 N ( 100 ≤ N ≤ 200 의 정수
  • 두 번째 줄 : 원본 암호문
  • 세 번째 줄 : 명령어의 개수 ( 10 ≤ N ≤ 20 의 정수)
  • 네 번째 줄 : 명령어
193
701633 517247 207227 598906 709204 177422 933135 361253 641488 272037 700207 210546 897237 133041 350385 701520 298460 312226 606874 129312 960451 613318 383985 199348 152779 133823 818875 580215 459355 605845 834805 106218 905612 938377 391231 841032 683166...
11
I 19 4 281822 746265 450734 108373 I 106 9 666218 302034 208501 648283 798327 631226 998665 959675 852007 D 117 1 D 191 2 D 10 3 D 133 1 D 76 1 I 105 7 362012 585269 876166 894252 294007 210018 659653 I 203 7 352576 568766 700855 768224 339990 691517 213258 D 84 4 I 6 6 291139 808642 764059 913376 124313 256337

 

출력
  • #테스트케이스번호 수정된 암호문의 앞 10개 암호
#1 701633 517247 207227 598906 709204 177422 291139 808642 764059 913376
#2 365906 969923 174155 356997 290732 844819 994015 645785 826206 259513

 

 

풀이
#테스트 케이스 10번 반복
for i in range(1, 11):
    N = int(input().strip())
    secrets = list(map(int, input().split()))
    M = int(input().strip())
    orders = input().split()

    j = 0 #처리중인 명령어 번호
    while j<len(orders):
        if orders[j] == "I":
            x = int(orders[j+1])
            y = int(orders[j+2])
            
            #삽입해야 할 암호들을 리스트에 넣고
            new_nums = list(map(int, orders[j+3:j+3+y]))
            #한 번에 삽입
            secrets[x:x] = new_nums
            j += 3 + y
        
        elif orders[j] == "D":
            x = int(orders[j+1])
            y = int(orders[j+2])
            #삭제할 구간 한 번에 삭제
            del secrets[x:x+y]
            j += 3
    
    result = " ".join(map(str,secrets[:10]))
    print(f"#{i} {result}")

 

1230과 유사한 문제

 

처리 중인 명령어 번호로 j를 두고 순차적으로 이동하면서 처리한다.

 

명령어 I 처리시 문자 I, x값과 y값, 삽입해야 할 수 y개를 거쳐서 처리하므로 다음 명령어는 3+y 이후가 된다.

따라서 j += 3 + y

이 때 암호들을 하나씩 삽입하면 시간 초과가 발생한다.

list1[x:x] = list2 형식으로 리스트의 x번째 다음에 다른 리스트를 삽입할 수 있다.

 

명령어 D 처리시 문자 D, x값과 y값을 거쳐서 처리하므로 다음 명령어는 3칸 이후가 된다.

따라서 j += 3

이 때 암호들을 하나씩 삭제하면 시간 초과가 발생한다.

del list1[x:x+y]로 해당 구간을 한 번에 삭제할 수 있다.