룰루코딩

SWEA D3 1228. [S/W 문제해결 기본] 8일차 - 암호문1 본문

SWEA

SWEA D3 1228. [S/W 문제해결 기본] 8일차 - 암호문1

rulru01 2024. 11. 15. 03:04

문제

https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=2&problemLevel=3&contestProbId=AV14w-rKAHACFAYD&categoryId=AV14w-rKAHACFAYD&categoryType=CODE&problemTitle=S%2FW+%EB%AC%B8%EC%A0%9C%ED%95%B4%EA%B2%B0+%EA%B8%B0%EB%B3%B8&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=3&pageSize=10&pageIndex=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개 항목을 추출하여 출력