-
[BOJ#5597번,10811번] list(map(int,range())), [*range()] 등차수열 리스트 만들기, 리스트 역순 방법 세 가지Programming 기초/Coding Test 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 범위의 인덱스만 역순
'Programming 기초 > Coding Test' 카테고리의 다른 글
[python#tip] print()의 end 옵션과 sep 옵션 (0) 2023.07.06 [BOJ#3052번] 나머지, set함수 활용 문제 (0) 2023.07.02 [BOJ#10807번] count(), list(map(int,input().split())) (0) 2023.06.17 [이코테 # 다이나믹 프로그래밍1] 설명 및 메모이제이션 (0) 2023.06.13 [Python Tip#1] input()보다 sys.stdin.readline()의 처리속도가 더 빠르다. (0) 2023.06.11