Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
Tags
- 참조변수타입변환
- openapi
- 백준
- 제너릭메서드
- 자바
- 99클럽
- 스레드동기화
- 향상된for문
- API
- 배열탐색
- Java
- 파일사용권한
- 프로젝트
- string메서드
- 루트사용자
- 코딩테스트
- 네이티브애플리케이션
- 4A피드백
- API명세서
- Spring
- SQL
- 재귀적사고
- ChatGPT
- 날씨API
- staging_area
- 동전교환알고리즘
- 성장형마인드셋
- 스프링
- 프로그래머스
- SQ3R
Archives
- Today
- Total
개발 공부용
1229. [S/W 문제해결 기본] 8일차 - 암호문2 본문
문제
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]로 해당 구간을 한 번에 삭제할 수 있다.
'코딩 테스트' 카테고리의 다른 글
| 1220. [S/W 문제해결 기본] 5일차 - Magnetic (0) | 2025.11.13 |
|---|---|
| 큐 | 1225. [S/W 문제해결 기본] 7일차 - 암호생성기 (0) | 2025.11.10 |
| 1230. [S/W 문제해결 기본] 8일차 - 암호문3 (0) | 2025.11.10 |
| 스택 | 1234. [S/W 문제해결 기본] 10일차 - 비밀번호 (0) | 2025.11.10 |
| 완전탐색(백트래킹) | S/W 문제해결 응용] 2일차 - 최대 상금 (0) | 2025.11.06 |