ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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 범위의 인덱스만 역순

     

    댓글

Designed by Tistory.