백준 10단계 (정렬) - 1번, 8번, 11번

LEE'S·2023년 1월 9일
0

백준

목록 보기
9/27

1번

풀다가 arr.sort() 가 생각이 안나서 직접 정렬을(?) 했다

num = int(input())
arr = []
sorted_arr = []

for i in range(num) :
    arr.append(int(input()))


while len(arr)!=0 :
    a = min(arr)
    sorted_arr.append(a)    
    arr.pop(arr.index(a))

for j in sorted_arr :
    print(j)

하다보니 sort() 와 sorted() 가 있는데 헷갈려서 다른 블로그들을 참고하여 알아보았다.

  • sort() : 원래 리스트에 영향을 줌
  • sorted() : 정렬한 새로운 리스트가 반환되며, 원래 리스트에는 영향을 주지 않는다

참고로 둘다 기본은 오름차순 이며 내림차순을 원한다면
sort(reverse = True) 로 작성해준다

8번

num = int(input())
arr = []

for i in range(num) :
    x, y = map(int, input().split())
    arr.append([x,y])


arr.sort()

for i in arr :
    print(i[0],i[1])
    
        

✨ sort() 내용 정리

✔️ 문자열 정렬

영어일 경우 대문자 -> 소문자 로 정렬된다 (만약 대소문자 말고 문자 자체로 비교하고 싶으면 lower() 사용하도록)

arr = ['a' , 'A', 'b' , 'D'] 
arr.sort()
print(arr)

# ['A', 'D', 'a', 'b']

✔️ key 사용

arr = ['b', 'ab', 'cbc']

arr.sort()
print(arr)
# ['ab', 'b', 'cbc']

arr.sort(key=len)
print(arr)
# ['b', 'ab', 'cbc']

예를 들어 문자열인 경우 그냥 기본적인 sort() 를 사용하면 abc 순으로 되지만
key = 함수 를 작성하면 정렬한 키를 반환하는 함수를 기준으롤 정렬된다.

key는 lambda 를 사용하여 나타낼 수 있다

lst = [[2, 1], [3, 4], [1, 2], [1, 3], [3, 2]]
lst.sort(key=lambda x:x[0])
print(lst)

# [[1, 2], [1, 3], [2, 1], [3, 4], [3, 2]]

만약 내림차순으로 하고 싶다면 - 를 붙인다

lst = [[2, 1], [3, 4], [1, 2], [1, 3], [3, 2]]
lst.sort(key=lambda x:-x[0])
print(lst)

key 가 여러개 일 경우
(첫번째 요소 먼저 비교하고 만약 같으면 두번째 요소 비교하도록)

arr = ['abb', 'acc', 'bcd']
sorted(arr, key=lambda x : (x[0], x[1]))

11번 (10814번)

위의 개념을 이용하여 풀이하였다

num = int(input())
arr = []

for i in range(num) :
    age, name = input().split()
    age = int(age)
    arr.append([age, i, name])

arr.sort(key = lambda x : ( x[0], x[1]))

for i in arr :
    print(i[0], i[2]) 

.
.
.
.
.

(+) 5번 (10989번)

왜 정답률이 낮는가 했더니 다 이유가 있었다. 메모리 초과의 문제이다..!!

일단 평소대로 코드를 푸는 방법이 메모리 초과가 나오는 이유는 ..

  • 빈 배열을 만들고 입력된 값을 append 하면 메모리 재할당이 이루어져서 메모리 측면에서 비효율적이다고 한다
  • 그리고 import sys 한 후 sys.stdin.readline()을 사용하면 input() 보다 더 빠르게 입력을 받을 수 있다고 한다.

이 문제의 핵심은 N 값이 10000 보다 작거나 같은 자연수라는 점이다

그러므로 이 문제는 다음과 같이 푸는 것이 좋다

  1. N 값이 최대 10000이 될 수 있으므로 먼저 10000개의 0이 들어있는 리스트를 만든다 (이때, 10001인 이유는 배열 인덱스는 0부터 시작하고 마지막 인덱스 숫자는 ( 전체 길이-1 ) 이기 때문이다 !)
  2. N을 입력을 받을 때 해당 입력값을 배열에 같은 인덱스에 +1 을 해준다. 예를들어 3을 한번 입력 받았다면 arr[3] 은 1, 9를 두번 입력받았다면 arr[9]는 2가 된다
  3. 마지막에 arr을 돌면서 해당 인덱스의 값이 0이 아니라면 값만큼 루프를 돌려서 해당 인덱스 숫자를 출력하도록 한다
import sys

num = int(sys.stdin.readline())

arr = [0]*10001

for _ in range(num) :
    n = int(sys.stdin.readline())
    arr[n] += 1

for i in range(len(arr)) :
    if arr[i] != 0 :
        for _ in range(arr[i]) :
            print(i)
profile
기록 블로그

0개의 댓글