※ SW Expert 아카데미의 문제를 무단 복제하는 것을 금지합니다.
N개의 10억 이하 자연수로 이뤄진 수열이 주어진다. 이 수열은 완성된 것이 아니라 M번의 편집을 거쳐 완성된다고 한다.
완성된 수열에서 인덱스 L의 데이터를 출력하는 프로그램을 작성하시오.
다음은 미완성 수열과 편집의 예이다.
인덱스 |
0 |
1 |
2 |
3 |
4 |
수열 |
1 |
2 |
3 |
4 |
5 |
I 2 7 -> 2번 인덱스 앞에 7을 추가하고, 한 칸 씩 뒤로 이동한다.
인덱스 |
0 |
1 |
2 |
3 |
4 |
5 |
수열 |
1 |
2 |
7 |
3 |
4 |
5 |
D 4 -> 4번 인덱스 자리를 지우고, 한 칸 씩 앞으로 이동한다.
인덱스 |
0 |
1 |
2 |
3 |
4 |
수열 |
1 |
2 |
7 |
3 |
5 |
C 3 8 -> 3번 인덱스 자리를 8로 바꾼다.
인덱스 |
0 |
1 |
2 |
3 |
4 |
수열 |
1 |
2 |
7 |
8 |
5 |
만약 편집이 끝난 후 L이 존재하지 않으면 -1을 출력한다.
[입력]
첫 줄에 테스트케이스의 수 T가 주어진다. 1<=T<=50
다음 줄부터 테스트 케이스의 별로 첫 줄에 수열의 길이 N, 추가 횟수 M, 출력할 인덱스 번호 L이 주어지고, 다음 줄에 수열이 주어진다.
그 다음 M개의 줄에 걸쳐 추가할 인덱스와 숫자 정보가 주어진다. 5<=N<=1000, 1<=M<=1000, 6<=L<=N+M
[출력]
각 줄마다 "#T" (T는 테스트 케이스 번호)를 출력한 뒤, 답을 출력한다.
입력 | 출력 |
3 5 3 4 1 2 3 4 5 I 2 7 D 4 C 3 8 5 5 2 15171 7509 20764 13445 10239 C 3 18707 C 1 20250 D 2 D 2 C 0 7158 10 10 8 27454 29662 2491 1819 10118 15441 7357 23618 972 398 D 7 D 1 D 6 I 3 2906 C 1 27121 D 3 D 2 D 1 D 2 C 2 20794 |
#1 5 #2 10239 #3 -1 |
🎀 나의 풀이
T = int(input())
# 여러개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
for test_case in range(1, T + 1):
N, M, L =map(int, input().split()) # 수열의 길이, 추가 횟수, 출력할 인덱스 번호
numbers=list(map(int, input().split())) # 수열
for _ in range(M) :
edit=list(input().split())
if edit[0] == 'I' : # 삽입
numbers.insert(int(edit[1]), int(edit[2]))
elif edit[0] == 'C' : # 바꾸기
numbers[int(edit[1])]=int(edit[2])
elif edit[0] == 'D' : # 삭제
numbers.pop(int(edit[1]))
try:
result=numbers[L]
except :
result=-1 # 출력할 인덱스 번호가 없으면
print(f"#{test_case} {result}")
추가할 인덱스와 숫자 정보를 edit에 리스트로 입력받는다.
edit의 첫번째 값이 I, C, D인지에 따라서 실행할 내용이 달라진다.
출력할 인덱스 번호가 없으면 에러가 나므로 try-except문으로 처리했다.
🎗 다른사람 풀이
def modify_seq():
for _ in range(M) :
command, *args = input().split() # 수행할 명령(추가, 삭제, 변환), 숫자 정보
if command == 'I' :
seq.insert(int(args[0]), int(args[1]))
elif command == 'D' :
seq.pop(int(args[0]))
elif command == 'C' :
seq[int(args[0])] = int(args[1])
try :
return seq[L]
except IndexError :
return -1
T=int(input())
for test_case in range(1, T+1):
# 수열의 길이 M, 추가 횟수 M, 출력할 인덱스 번호 L
N, M, L=map(int, input().split())
seq=list(map(int, input().split()))
print(f"#{test_case} {modify_seq()}")
나랑 같은 알고리즘.
가변매개변수를 사용해서 숫자를 담는다.
class Node :
def __init__(self, data):
self.data=data
self.link=None
class LinkedList :
def __init__(self):
new_node=Node('head')
self.head=new_node
self.tail=new_node
self.before=None
self.current=None
def append(self, data):
new_node=Node(data)
self.tail.link=new_node
self.tail=new_node
def move(self, idx) :
self.current=self.head.link
self.before=self.head
for _ in range(idx):
if self.current == None :
return False
self.before=self.current
self.current=self.current.link
return True
def insert(self, idx, data):
new_node=Node(data)
self.move(idx)
self.before.link=new_node
new_node.link=self.current
def delete(self, idx):
self.move(idx)
self.before.link=self.current.link
def change(self, idx, data):
self.move(idx)
self.current.data=data
def result(self, idx):
if self.move(idx):
return self.current.data
else:
return -1
T=int(input())
for tc in range(1, 1+T):
N, M, L = map(int, input().split())
mylst=LinkedList()
for i in map(int, input().split()):
mylst.append(i)
for _ in range(M):
data=list(input().split())
if data[0] == 'I' :
mylst.insert(int(data[1]), int(data[2]))
elif data[0] == 'D' :
mylst.delete(int(data[1]))
elif data[0] == 'C' :
mylst.change(int(data[1]), int(data[2]))
print("#{} {}".format(tc, mylst.result(L)))
'coding test' 카테고리의 다른 글
[파이썬] 5176. 이진탐색 (0) | 2021.02.05 |
---|---|
[파이썬] 5174. subtree (0) | 2021.02.04 |
[파이썬] 5120. 암호 (0) | 2021.02.01 |
[파이썬] 5110. 수열 합치기 (0) | 2021.01.29 |
[파이썬] 5108. 숫자 추가 (0) | 2021.01.29 |