개발 공부용

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

코딩 테스트

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

솝제로 2025. 11. 10. 09:59
문제

 

 

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 ]
3. A(추가) y, s : 암호문 뭉치 맨 뒤에 y개의 암호문을 덧붙인다. s는 덧붙일 암호문들이다. [ ex) A 2 421257 796813 ]

 

 

입력
  • 첫 번째 줄 : 원본 암호문 뭉치 속 암호문의 개수 N ( 2000 ≤ N ≤ 4000 의 정수)
  • 두 번째 줄 : 원본 암호문 뭉치
  • 세 번째 줄 : 명령어의 개수 ( 250 ≤ M ≤ 500 의 정수)
  • 네 번째 줄 : 명령어
3198
801199 482510 422184 242474 876697 940126 116534 339876 247263 458098 825098 223019 514111 303365 893555 243643 601338 454353 574796 689563 658854 865075 999888 791926 506889 150144 881247 837754 384870 933366 151318 687639 496390 595628 735176 968833 750368...
425
I 3186 6 111702 108909 437791 460849 808743 573893 A 6 902149 801457 885061 112389 207283 358796 A 1 989955 D 1100 5 D 613 9 D 998 1 D 2199 8 D 587 6 D 143 8 D 1945 6 I 5 1 362947 I 7 4 625354 271596 881263 415567 D 2452 10 A 6 351214 252282 334858 374262 106813 994606 I 1511 6 620092 829075 862184 856364 360195 511867 D 1320 6 A 8 871822 227120 817588 231183 650912 326064 820579 435543 D 2700 9 D 2175 9...

 

 

출력
  • #테스트케이스 번호 수정한 암호문 뭉치 앞 10개 암호문
#1 471034 815406 542284 170257 228297 740370 785047 677617 834173 648732
#2 364373 466241 450661 237978 437060 679163 812457 727955 262600 218437

 

 

풀이

 

for i in range(1, 11):
    N = int(input().strip()) #원본 암호문 뭉치 속 암호문의 개수 N
    secrets = list(map(int, input().split())) #원본 암호문 뭉치
    M = int(input().strip()) #명령어의 개수 ( 250 ≤ M ≤ 500 의 정수)
    orders = input().split() #명령어
    
    j = 0
    while j < len(orders):
        if orders[j] == "I":
            x = int(orders[j+1])
            y = int(orders[j+2])
            for k in range(y):
                secrets.insert(x+k, int(orders[j+3+k]))
            j += 3 + y

        elif orders[j] == "D":
            x = int(orders[j+1])
            y = int(orders[j+2])
            for _ in range(y):
                del secrets[x]
            j += 3

        elif orders[j] == "A":
            y = int(orders[j+1])
            for k in range(y):
                secrets.append(int(orders[j+2+k]))
            j += 2 + y

    secret = " ".join(map(str, secrets[:10]))
    print(f"#{i} {secret}")

 

while문으로 명령어의 개수만큼 돌면서 명령어를 처리하면 되는 문제.

j는 현재 처리하고 있는 명령어의 위치를 나타낸다.

x와 y값을 우선 저장하고, y값 기반으로 for문을 돌면서 암호문을 삽입, 삭제, 추가한다.

 

하나의 명령어를 처리한 후  현재 처리하고 있는 명령어의 위치를 갱신한다.

I 명령어의 경우 x,y와 삽입한 암호문 개수만큼 j에 더해준다.

 

while문을 다 돌면 수정된 암호문을 10개까지만 출력한다.