백준 정렬(2)

2024. 12. 10. 22:36Algorithms/백준알고리즘 연습

어제 못푼거

2751번 수 정렬하기 2

메모리/시간이 중요한 문제였음

수정렬하기 3번이랑 다른 점 

이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다.

 

참고 3번 정답

import sys

n = int(sys.stdin.readline())
count = [0] * 10001  # 0부터 10000까지의 숫자를 카운트할 리스트

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

for i in range(10001):
    if count[i] > 0:
        for _ in range(count[i]):
            print(i)

 

 

2번 초기 코드 

n = int(input())
for _ in range(n):
    nums = [map(int, input().split())]
sort(nums)
for i in nums:
    print(i)

 

시간초과가 발생하였는데 이유는 아래와 같음

1. 문제에서 첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다.

그러면 일단 nums를만드는데 있어 루프가 너무 많이 돌아감. 

 

2번정답코드

import sys

n = int(sys.stdin.readline())
nums = set()  # 중복을 피하기 위해 set 사용

for _ in range(n):
    num = int(sys.stdin.readline())
    nums.add(num)

for num in sorted(nums):  # 정렬된 순서로 출력
    print(num)

계수정렬 알고리즘을 이용하여 이렇게 풀 수도 있음

import sys

n = int(sys.stdin.readline())
nums = [0] * 2000001  # 음수를 포함한 범위, 나는 abs(100001)을 했는데먹히지 않았음 

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

for i in range(2000001):
    if nums[i]:
        print(i - 1000000)

계수정렬 알고리즘을 쓰면 메모리, 시간 모두 줄어드는 것을 알 수 있음

계수 정렬

  데이터의 크기 범위가 작을때, 사용할 수 있는 매우 빠른 정렬 알고리즘이다.

일반적으로 데이터 크기 범위가 1,000,000(백만)을 넘지 않을때만 사용할 수 있음

[ 계수 정렬의 시간복잡도 ]

데이터의 갯수를 M, 데이터의 최대값 크기를 K라고 할때, 계수 정렬의 시간복잡도는 O(N+K)로 이제까지 살펴본 정렬 알고리즘 중 가장 빠르다. 하지만 데이터의 최대값 크기만큼의 메모리가 필요하기 때문에 심각한 비효율성을 초래할 수 있다. 예를 들어 10,000,000와 1로 단 2개의 데이터를 가지고 있을때도 10,000,001크기의 리스트를 선언해야한다. 때문에 계수 정렬은 데이터의 크기 범위가 작을때만 사용하는 것이 좋다. 

출처 : https://doing7.tistory.com/73

 

[알고리즘] 정렬 with Python

💡 정렬 알고리즘 정렬이란, 데이터를 특정한 기준에 따라서 순서대로 나열하는 것을 말한다. 정렬 알고리즘은 굉장히 다양한데 이번 포스팅에서는 가장 많이 사용하는 선택 정렬, 삽입 정렬,

doing7.tistory.com

 

 

이틀 째 이해중인데 다른 정열은 이해가는데 얘는 도통 인덱스를 마지막에 불러온다는 말을 이해 못하겠다. 다른 강의도 들어봐야지..

 

1427번

소트인사이드

받은 수를 문자행으로 바꾸고, reverse 나열해서 다시 합치면 됨 

import sys

n = int(sys.stdin.readline())
def solution(n):
    n= str(n)
    n_sort= sorted(n,reverse=True)
    return int("".join(n_sort))
c = solution(n)
print(c)

 

함수를 정의하는게 아직 초보임 

 

n = int(input() 이렇게 받아오면

인풋받아오는 것만 해도 4ms 가 더 걸림

메모리는 import sys 쓸때와 같음

 

 

11650번 좌표 정렬하기 

문제

2차원 평면 위의 점 N개가 주어진다. 좌표를 x좌표가 증가하는 순으로, x좌표가 같으면 y좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.

 

출력

첫째 줄부터 N개의 줄에 점을 정렬한 결과를 출력한다.

예제 입력 1 복사

5
3 4
1 1
1 -1
2 2
3 3

예제 출력 1 복사

1 -1
1 1
2 2
3 3
3 4

 

초기 만든 코드

import sys
n = int(sys.stdin.readline())
cor = []
for _ in range(n):
    cor.append(input().split())

def solution(data):
        return int(data[0])
result = sorted(cor, key=solution)
#x좌표로 순서대로나열
for i in range(map(int,result)):
    if sum(result(i)) > sum(result(i+1)) :
          result[i], result[i+1] = result[i+1], result[i]

for r in result:
    print(r, end=' ')

틀렸다. 타입에러가 난다 

x좌표가 같으면 y좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램 이 부분이 조금 어려운 것 같다. 

정답 코드(by perplexity ai )

import sys

n = int(sys.stdin.readline())
cor = []
for _ in range(n):
    x, y = map(int, sys.stdin.readline().split())
    cor.append((x, y))

cor.sort(key=lambda p: (p[0], p[1]))

for x, y in cor:
    print(x, y)

x,y 를 받고 리스트 형태로 저장한다. 

리스트 안에 또 리스트를 넣어 저장할 수 있다는 사실을 2년전에 배운거같은데 진짜 하나도 기억을 못하는 것 같다. 

 

cor.sort(key=lambda p: (p[0], p[1]))

lambda 함수를 써서 key가 p[0]참고하고, 나중에 p[1]를 써서 나열하도록

- 여기에서 p는 임시 변수이다. 아무 알파벳이나 써도 됨

그리고 x,y를 프린트하도록 함 

 

11651번 좌표정렬하기 2

문제

2차원 평면 위의 점 N개가 주어진다. 좌표를 y좌표가 증가하는 순으로, y좌표가 같으면 x좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.

출력

 

첫째 줄부터 N개의 줄에 점을 정렬한 결과를 출력한다.

예제 입력 1 복사

5
0 4
1 2
1 -1
2 2
3 3

예제 출력 1 복사

1 -1
1 2
2 2
3 3
0 4

 이건 cor.sort(key=lambda p: (p[0], p[1])) 얘 순서만 바꿔주면 됨 

 

1181번 단어 정렬

알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.

  1. 길이가 짧은 것부터
  2. 길이가 같으면 사전 순으로

단, 중복된 단어는 하나만 남기고 제거해야 한다.

입력

첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.

출력

조건에 따라 정렬하여 단어들을 출력한다.

예제 입력 1 복사

13
but
i
wont
hesitate
no
more
no
more
it
cannot
wait
im
yours

예제 출력 1 복사

i
im
it
no
but
more
wait
wont
yours
cannot
hesitate

 

초기 코드

import sys
n = int(sys.stdin.readline())
cor = []
for _ in range(n):
    x = str(sys.stdin.readline())
    cor.append(x)
cor = set(cor) #중복제거
cor.sort(key=len) #글자크기로나열
cor_sorted = sorted(cor) #알파벳크기로나열
for i in cor:
    print(i)

 

답안 코드 (직접 써보기)

import sys
n = int(sys.stdin.readline())
cor = set()
for _ in range(n):
	x = sys.stdin.readline().strip()
    cor.add(x)

sorted_cor = sorted(cor, key= lambda x: (len(x),x))
for i in range(len(sorted_cor)):
    print(i)

 

10814 나이순 정렬 

 

첫번째 숫자 순서대로 나열하고, 두번째 값의 원래 인덱스 순서대로 나열해야 한다

import sys
a_list = []
n = int(sys.stdin.readline())
for _ in range(n):
    x = sys.stdin.readline().split()
    a_list.append(x)

sorted_a_list = sorted(a_list, key= lambda x: (int(a_list[0]),a_list[1]))
for i in sorted_a_list:
    print(i)

틀림

 

import sys

a_list = []
n = int(sys.stdin.readline())
for _ in range(n):
    age, name = sys.stdin.readline().split()
    a_list.append((int(age), name))

sorted_a_list = sorted(a_list, key=lambda x: x[0])  # 나이만으로 정렬

for age, name in sorted_a_list:
    print(f"{age} {name}")

두가지 요소의 성질이 다르면, 그냥 인수 자체를 두가지로 넣어주면 됨 

 

'Algorithms > 백준알고리즘 연습' 카테고리의 다른 글

약수, 배수와 소수 2  (2) 2024.12.14
백준 집합과 맵  (0) 2024.12.11
백준 부루트 포스 (복습 필요)  (2) 2024.12.09
백준 시간복잡도  (0) 2024.12.07
백준 기하  (0) 2024.12.07