coding test

[파이썬] 5122. 수열 편집

잔망루피 2021. 2. 3. 20:33

※ 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