본문 바로가기

백준 write-up/정렬 & 그리디

[백준] Yangjojang of The Year : 11557번 - Python

728x90
반응형

https://www.acmicpc.net/problem/11557

 

11557번: Yangjojang of The Year

입학 OT때 누구보다도 남다르게 놀았던 당신은 자연스럽게 1학년 과대를 역임하게 되었다. 타교와의 조인트 엠티를 기획하려는 당신은 근처에 있는 학교 중 어느 학교가 술을 가장 많이 먹는지

www.acmicpc.net

 

 

 

문제를 풀면서 몰랐던 개념

 

- 이중 반복문 안에서 입력 받은 값들을 각기 다른 리스트에 저장하는 방법

: 빈 리스트를 선언할 때 항상 전역 변수로만 선언했었는데, 첫 번째 반복문의 횟수만큼 두 번째 반복문이 돌아갈 때마다 리스트를 생성하려면 for 문 내에 선언해야 한다는 것을 알게 되었다.

for _ in range(T):
    arr = []	# 이거!!!
    N = int(input())

    for i in range(N):
        S,L = input().split()
        L = int(L)
        arr.append([L, S])

 

 

 

문제의 접근 방법

 

- 학교 별 술 소비량을 어떻게 따로 리스트에 저장할 지 고민하기

- 2차원 배열의 정렬 방법 생각하기

- 중첩 for문

- 한 줄에 공백을 두고 입력되는 값이 문자와 숫자 두 가지라는 사실 유념하기

 

 

 

내가 막혔던 부분

 

- 중첩 반복문 안에서 새로운 for 문이 돌 때마다 새롭게 리스트를 구성해서(나눠서) 추가하는 방법

 

 

 

문제 풀이 방법

 

(1) 테스트 케이스 T 값 입력받기

(2) T번만큼 입력받을 학교의 숫자 N개 입력 받기 (이 때, 다음 반복문에서 입력받게 될 학교이름과 술 소비량을 저장할 빈 리스트 arr 선언).

(3) N번만큼 학교이름(S), 술 소비량(L) 입력 받고, L은 정수이기 때문에 int로 형변환 시켜주기

(4) 앞에서 선언해주었던 리스트 arr에 S와 L의 순서를 바꿔서 추가 (정렬을 위해서).

(5) 리스트 arr 를 내림차순으로 정렬

(6) 이 정렬된 리스트들(N번만큼 입력되는 S,L을 저장한 arr)을 빈 리스트 alist에 추가하기 -> 3차원 배열 생성

(7) 이미 정렬된 리스트들이기 때문에 반복문을 돌려서 i번째 인덱스들 중 가장 앞에 있는 값의 두번째 요소를 출력.

 

 

 

 

소스코드

T = int(input())    # Test Case

alist = []

for _ in range(T):
    arr = []
    N = int(input())

    for _ in range(N):
        S,L = input().split()
        L = int(L)
        arr.append([L, S])
        arr.sort(reverse=True)
    alist.append(arr)

[print(alist[i][0][1]) for i in range(len(alist))]
728x90
반응형