일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- UML
- 삼성
- 취뽀
- 디자인패턴
- 우테코 프리코스
- 부트캠프
- 백준
- SWEA
- 비전공자
- 우테코
- 파이썬
- 마이스터고
- 삼성 부트캠프
- 코딩
- 13기
- 정보처리기사
- 프리코스
- SSAFY
- 삼성 청년 SW 아카데미
- 개발자
- 코테
- 코딩테스트
- 삼성청년SW아카데미
- 싸피
- 정처기
- dfs
- 백준 2003
- 삼성 청년 sw아카데미
- 우테코 7기
- 싸피 13기
Archives
- Today
- Total
룰루코딩
SWEA D3 1228. [S/W 문제해결 기본] 8일차 - 암호문1 본문
문제
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
솔루션
for t in range(1,11):
N = int(input())
li = list(map(int, input().split()))
cmd_N = int(input())
cmd = list(map(str, input().split("I")))
new_cmd = []
for i in cmd[1:]:
new_cmd.append(i.split())
for i in new_cmd:
start = int(i[0])
n = int(i[1])
insert = i[2:]
li = li[:start] + insert + li[start:]
print(f"#{t}",end=" ")
print(*li[:10])
깨달은 점
명령어 문자열 분리하는게 조금 까다로웠다.
cmd = list(map(str, input().split("I")))
new_cmd = []
for i in cmd[1:]:
new_cmd.append(i.split())
I 0 4 600576 565945 486128 594841 I 0 1 150706 ...
이런식으로 들어오면 먼저 I로 문자열을 나눠 리스트에 저장한다.
cmd[1:]부분은 맨앞 빈 리스트 배열을 빼준채로
새로운 배열에 빈칸을 기준으로 나누어 다시 저장한다.
for i in new_cmd:
start = int(i[0])
n = int(i[1])
insert = i[2:]
li = li[:start] + insert + li[start:]
for문을 이용해 새로운 배열에서
명령어의 부분부분을 나눠서 저장한다.
그 후 기존 리스트에 시작부분 인덱스와 삽입값을 이용해 끼워 넣는다.
다른 풀이를 찾아보니 여러 풀이방법이 있었다.
for tc in range(1, 11) :
N = int(input())
li = list(map(int, input().split()))
cmd_N = int(input())
cmd = list(input().split())
type = ''
pos = -1
cnt = -1
for i in range(len(cmd)) :
if cmd[i] == 'I' :
type = cmd[i]
pos = -1
cnt = -1
else :
if type == 'I' :
if pos == -1 :
pos = int(cmd[i])
continue
else :
if cnt == -1 :
cnt = int(cmd[i])
continue
li.insert(pos, cmd[i])
pos += 1
print('#%d' % tc, end=' ')
print(*li[:10])
- 초기 입력 처리
- N을 통해 암호문의 길이를 입력받고, 암호문을 li 리스트에 저장
- cmd_N은 명령어의 개수로, 이후 cmd 리스트에서 각 명령어를 처리
- cmd 리스트는 공백 기준으로 입력된 모든 명령어를 문자열 리스트로 저장
- 명령어 처리 준비
- type, pos, cnt 변수를 초기화
- -1은 해당 변수가 아직 초기 상태임을 나타내는 값으로 사용
- type은 명령어의 유형을 저장, pos와 cnt는 각각 삽입 위치와 삽입할 숫자의 개수를 저장
- 명령어 해석과 처리
- cmd 리스트의 각 요소를 순회
- cmd[i] == 'I'인 경우
- 새 I 삽입 명령을 만난 것이므로 type을 "I"로 설정, pos와 cnt를 초기화
- type == 'I'인 경우:
- pos == -1인 경우, cmd[i]를 pos에 저장하여 삽입 위치로 사용
- cnt == -1인 경우, cmd[i]를 cnt에 저장하여 삽입할 숫자 개수로 사용
- 그 이후의 값들은 삽입할 숫자들이므로, li.insert(pos, int(cmd[i]))로 pos 위치에 숫자를 삽입
- . 삽입 후 pos를 증가시켜 다음 위치에 이어서 삽입할 수 있도록
- 출력:
- 수정된 암호문의 처음 10개 숫자를 출력
for t in range(1, 11):
# 입력 받기
N = int(input()) # 암호문의 길이
li = list(map(int, input().split())) # 원본 암호문
cmd_N = int(input()) # 명령어의 개수
cmd = input().split() # 명령어
# 명령어 처리
idx = 0
while idx < len(cmd):
if cmd[idx] == "I":
# "I" 명령어 다음의 x, y, s 파라미터를 읽어들임
x = int(cmd[idx + 1]) # 삽입 위치
y = int(cmd[idx + 2]) # 삽입할 숫자의 개수
s = list(map(int, cmd[idx + 3: idx + 3 + y])) # 삽입할 숫자 리스트
# 원본 암호문에 숫자 삽입
for i, num in enumerate(s):
li.insert(x + i, num)
# 인덱스를 명령어 다음으로 이동
idx += 3 + y
else:
idx += 1
# 결과 출력
print(f"#{t} {' '.join(map(str, li[:10]))}")
- 입력 처리
- N을 입력받고, 암호문을 li리스트로 저장
- 명령어의 개수 cmd_N를 입력받고, 각 명령어를 담은 리스트 cmd를 생성
- 명령어 순회
- while 루프를 통해 cmd리스트를 순차적으로 처리
- cmd[idx] == "I"로 I 명령어가 등장할 때마다:
- 삽입 위치 x, 삽입할 숫자의 개수 y, 삽입할 숫자 리스트 s를 추출
- enumerate(s):
- enumerate(s)는 리스트 s의 요소를 인덱스와 함께 반환
- 예) s = [123152, 487651, 245496]일 경우, enumerate(s)는 (0, 123152), (1, 487651), (2, 245496) 형태로 인덱스와 값을 반환
- li.insert()를 통해 x 위치 다음에 숫자 s 리스트를 삽입
- idx += 3 + y로 인덱스를 이동하여 다음 명령어를 처리
- 결과 출력
- li[:10]으로 수정된 암호문의 처음 10개 항목을 추출하여 출력
'SWEA' 카테고리의 다른 글
SWEA D3 1230. [S/W 문제해결 기본] 8일차 - 암호문3 (3) | 2024.11.15 |
---|---|
SWEA D3 1229. [S/W 문제해결 기본] 8일차 - 암호문2 (0) | 2024.11.15 |
SWEA D3 1225. [S/W 문제해결 기본] 7일차 - 암호생성기 (1) | 2024.11.14 |
SWEA D3 1221. [S/W 문제해결 기본] 5일차 - GNS (6) | 2024.11.14 |
SWEA D3 1217. [S/W 문제해결 기본] 4일차 - 거듭 제곱 (4) | 2024.11.14 |