Programming 기초/Coding Test

[BOJ#5597번,10811번] list(map(int,range())), [*range()] 등차수열 리스트 만들기, 리스트 역순 방법 세 가지

코딩상륙작전 2023. 7. 2. 22:25

* 과제 안 내신 분..?(5597번 문제)

<문제>

X대학 M교수님은 프로그래밍 수업을 맡고 있다. 교실엔 학생이 30명이 있는데, 학생 명부엔 각 학생별로 1번부터 30번까지 출석번호가 붙어 있다.

교수님이 내준 특별과제를 28명이 제출했는데, 그 중에서 제출 안 한 학생 2명의 출석번호를 구하는 프로그램을 작성하시오.

 

<입력>

입력은 총 28줄로 각 제출자(학생)의 출석번호 n(1 ≤ n ≤ 30)가 한 줄에 하나씩 주어진다. 출석번호에 중복은 없다.

 

<출력>

출력은 2줄이다. 1번째 줄엔 제출하지 않은 학생의 출석번호 중 가장 작은 것을 출력하고, 2번째 줄에선 그 다음 출석번호를 출력한다.

arr=list(map(int,range(1,31)))
for i in range(28):
    arr.remove(int(input()))
print(*arr)

-> range를 이용하여 list를 만드는 방법을 잘 익혀두자.

-> 문제 접근 방법에서 소거법!! remove 모듈 알아두기.

 

* 바구니 뒤집기(10811번 문제)

<문제>

도현이는 바구니를 총 N개 가지고 있고, 각각의 바구니에는 1번부터 N번까지 번호가 순서대로 적혀져 있다. 바구니는 일렬로 놓여져 있고, 가장 왼쪽 바구니를 1번째 바구니, 그 다음 바구니를 2번째 바구니, ..., 가장 오른쪽 바구니를 N번째 바구니라고 부른다.

도현이는 앞으로 M번 바구니의 순서를 역순으로 만들려고 한다. 도현이는 한 번 순서를 역순으로 바꿀 때, 순서를 역순으로 만들 범위를 정하고, 그 범위에 들어있는 바구니의 순서를 역순으로 만든다.

바구니의 순서를 어떻게 바꿀지 주어졌을 때, M번 바구니의 순서를 역순으로 만든 다음, 바구니에 적혀있는 번호를 가장 왼쪽 바구니부터 출력하는 프로그램을 작성하시오.

 

<입력>

첫째 줄에 N (1 ≤ N ≤ 100)과 M (1 ≤ M ≤ 100)이 주어진다.

둘째 줄부터 M개의 줄에는 바구니의 순서를 역순으로 만드는 방법이 주어진다. 방법은 i j로 나타내고, 왼쪽으로부터 i번째 바구니부터 j번째 바구니의 순서를 역순으로 만든다는 뜻이다. (1 ≤ i ≤ j ≤ N)

도현이는 입력으로 주어진 순서대로 바구니의 순서를 바꾼다.

 

<출력>

모든 순서를 바꾼 다음에, 가장 왼쪽에 있는 바구니부터 바구니에 적혀있는 순서를 공백으로 구분해 출력한다.

n,m = map(int, input().split())
s = [*range(1,n+1)]
for _ in range(m):
    i,j = map(int, input().split())
    s[i-1:j] = s[i-1:j][::-1]
print(*s)

-> 등차수열을 리스트로 만들 때, list(map(int,range()))이 아닌, [*range()]도 가능하다.

-> 리스트 슬라이싱의 응용(리스트 슬라이스는 원본 리스트 객체를 복사한 것임을주의.)

-> 리스트의 지정 범위(a이상, b이하)에서의 역순하는 방법 -> arr[a:b+1]=arr[a:b+1][::-1]

m = 4
s = [*range(1, 6)]
print(type(s))
print(*s)
s[1:4] = s[2:4][::-1]
print(*s)
------------------------------

결과
<class 'list'>
1 2 3 4 5
1 4 3 5

------------------------------

 

 

* 리스트를 역순하는 세 가지 방법

1. 리스트 객체 내장(제공) 함수 : list.reverse()

arr = [*range(1, 6)]
print(arr)

arr.reverse()
print(arr)
--------------------------
[1, 2, 3, 4, 5]
[5, 4, 3, 2, 1]

 

2. 파이썬 기본 라이브러리 함수 : reversed(list)

reversed()는 원본 객체를 변경시키지 않고, 역순을 취한 새로운 객체를 반환하기 때문에 print(reversed(arr))는 객체의 주소값이 출력된다.

arr = [*range(1, 6)]
print(arr)

reversed(arr)
print(arr)

print(reversed(arr))

arr = list(reversed(arr))
print(arr)

------------------------------------
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]        
<list_reverseiterator object at 0x00000247D2898790>
[5, 4, 3, 2, 1]

 

3. 리스트 슬라이스

리스트 기능인 슬라이스 기능을 사용하여 역순으로 정렬할 수 있다.

위 세 가지 방법 중에 가장 쉽게 범위를 지정하여 역순로 정렬하는 것이 가능하다.

리스트 슬라이스는 리스트 원본을 수정하는 것이 아닌 새로운 리스트객체를 생성한다.

arr = [*range(1, 6)]
print(arr)

arr[0 : len(arr)] = arr[::-1]
print(arr)

arr[0:5] = arr[0:5][::-1]
print(arr)

# a이상 b이하의 인덱스 요소를 역순으로 정렬
a, b = 2, 4
arr[a - 1 : b] = arr[a - 1 : b][::-1]
print(arr)

------------------------------------------

[1, 2, 3, 4, 5]		# 원본 배열
[5, 4, 3, 2, 1]		# 전체 역순
[1, 2, 3, 4, 5]		# 다시 전체 역순
[1, 4, 3, 2, 5] 	# a,b 범위의 인덱스만 역순