문제풀이/백준(Boj) 문제풀이

문제풀이/백준(Boj) 단계별 풀이백준 - 단계별로 풀기 12단계 파이썬 - (정렬 단계 - 2750번, 2751번, 10989번, 2108번, 1427번, 11650번, 11651번, 1181번, 10814번, 18870번)

얄루몬 2021. 8. 9. 01:49

 

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

 

2750번: 수 정렬하기

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수 주어진다. 이 수는 절댓값이 1,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.

www.acmicpc.net

n = int(input())
n_lst=[]
for _ in range(n): 
    n_lst.append(int(input()))
    
n_lst.sort()

for i in n_lst:
    print(i)

- 미리 오름차순으로 정렬해놓은 리스트를 for문을 돌면서 출력하면 됨


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

 

2751번: 수 정렬하기 2

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.

www.acmicpc.net

import sys

n = int(input())
n_lst=[]
for _ in range(n): 
    n_lst.append(int(sys.stdin.readline()))#1
    
n_lst.sort()

for i in n_lst:
    sys.stdout.write(str(i)+'\n')#2

📌.input대신 사용한 함수에 대해서 자세히 정확히 정리해주셨습니다.!

 https://velog.io/@yeseolee/Python-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%85%EB%A0%A5-%EC%A0%95%EB%A6%ACsys.stdin.readline

 

[Python 문법] 파이썬 입력 받기(sys.stdin.readline)

파이썬으로 코딩 테스트를 준비한다면, 반드시 알아야 할 입력방식인 sys.stdin.readline()에 대한 정리 입니다.

velog.io

#1. input대신 sys.stdin.readline으로 입력받기. 

#2. str을 써주는 이유도 위의 페이지에서 정확하게 설명해주셨습니다. 꼭 읽고 넘어가주세요 모르시면! 


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

 

10989번: 수 정렬하기 3

첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 숫자가 주어진다. 이 수는 10,000보다 작거나 같은 자연수이다.

www.acmicpc.net

import sys
N = int(input())
check_list = [0] * 10001
for i in range(N):
    input_num = int(sys.stdin.readline())
    check_list[input_num] = check_list[input_num] + 1
for i in range(10001):
    if check_list[i] != 0:
        for j in range(check_list[i]):
            print(i)

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

 

2108번: 통계학

첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.

www.acmicpc.net

패키지가 없다해서.. 파이썬 패키지까지 다운받아가며 문제를 풀었다.

import sys #1. input을 썼을 때 시간초과 막기위함 
from collections import Counter

n = int(sys.stdin.readline())
lst = []

for i in range(n):
    lst.append(int(sys.stdin.readline()))
    
lst.sort()
lst_n = Counter(lst).most_common()#3. 최빈값을 알기 위해서. 
#print(lst_n) #[(값, 몇개인지),(값, 몇개인지),(값, 몇개인지),(값, 몇개인지)...]

print(round(sum(lst) / n)) #4. 평균값
print(lst[n // 2]) #5. 중간값
if len(lst_n) > 1:
    if lst_n[0][1] == lst_n[1][1]: #[(0 , 0), (0 , 1), (... , ...), (... , ....)]
        print(lst_n[1][0]) #최빈값을 출력한다. (여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다.라는 조건을 만족하기 위함)
    else:
        print(lst_n[0][0])
        #[0][1] / [1][1] : 리스트의 숫자를 세어 놓은 몇개인지.
        #[0][0]/ [1][0] :리스트에 넣은 값(실제 값.)
else:
    print(lst_n[0][0]) #리스트에 값이 하나만 들었을 땐 lst[0]을 출력해준다.
print(lst[-1] - lst[0]) #범위 [-1]은 맨 마지막 요소 / [0]은 맨 처음 요소 젤 큰 값 - 작은 값 = 범위

- 결국 위의 패키지를 쓰지 않고 풀었다.

- 시간초과를 막기 위해서는 input대신 sys...를 써준다.

- 혹시라도 이해가 안 되는 분들이나, 나중에 또 이해를 못할 나를 위해서.. 친절하게 풀어놨다. 문제와 상관 없이 내가 임의로 넣은 숫자들임! 

- 최빈값을 구할 때 [0][1]과 [1][1]만 비교하는 이유는 여러개 입력받은 값이 있을 때 두번째로 작은 수를 출력하기 위해서는 [2][1]부턴 필요하지가 않기 때문이다.

- [입력받은 값][값이 몇개인지]


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

 

1427번: 소트인사이드

첫째 줄에 정렬하고자하는 수 N이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이다.

www.acmicpc.net

<오답>

#1427

n = list(input())

n.sort()

for i in range(1,len(n)):
    print(i, end='')

- 내림차순을 올림차순으로 정렬해서 틀림 ㅋㅋ ..

 

<정답>

#1427

n = list(input())

n.sort(reverse=True) #내림차순을 위한 함수 사용.

for i in n:
    print(i,end='')

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

 

11650번: 좌표 정렬하기

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

www.acmicpc.net

import sys

n = int(sys.stdin.readline())
xy_lst = []
for i in range(n):
    xy_lst.append(list(map(int, sys.stdin.readline().split())))
xy_lst.sort(key=lambda x:(x[0],x[1]))
for i in xy_lst:
    print(i[0],i[1])


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

 

1181번: 단어 정렬

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

www.acmicpc.net

 

n = int(input())
lst = []

for _ in range(n):
    lst.append(input())

set_lst=set(lst) #중복제거
lst = list(set_lst) #lst에 다시 대입(중복제거한 리스트를)
lst.sort() #알파벳순서대로 정렬
lst.sort(key=len) #알파벳 순서대로 정렬한 리스트들 다시 길이를 기준으로 정렬

for i in lst:
    print(i)
import sys

n = int(sys.stdin.readline())
lst = []

for _ in range(n):
    lst.append(sys.stdin.readline().strip())

set_lst=set(lst)
lst = list(set_lst)
lst.sort()
lst.sort(key=len)

for i in lst:
    print(i)

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

 

10814번: 나이순 정렬

온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을

www.acmicpc.net

<오답>

import sys

n = int(sys.stdin.readline())
lst = []

for _ in range(n):
    lst.append(list(map(str,sys.stdin.readline().split())))

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

for i in range(len(lst)):
    for j in range(0,1):
        print(lst[i][j],lst[i][j+1])
3
21 Junkyu
21 Dohyun
20 Sunyoung

20 Sunyoung
21 Dohyun
21 Junkyu


>>> lst
[['20', 'Sunyoung'], ['21', 'Dohyun'], ['21', 'Junkyu']]

- 정렬 기준을 잘못 잡아서 틀림 

import sys

n = int(sys.stdin.readline())
lst = []

for _ in range(n):
    lst.append(list(map(str,sys.stdin.readline().split())))

lst.sort(key=lambda x:(x[0]))

for i in range(len(lst)):
    for j in range(0,1):
        print(lst[i][j],lst[i][j+1])

- IDLE에선 정확하게 답이 나왔는데 틀렸다고 나온다 ㅎ ...


<정답>

n = int(input())
lst = []

for _ in range(n):
    lst.append(list(map(str,input().split())))

lst.sort(key=lambda x:int(x[0]))

for i in range(n):
    print(lst[i][0],lst[i][1])
import sys

n = int(sys.stdin.readline())
lst = []

for _ in range(n):
    lst.append(list(map(str,sys.stdin.readline().split())))

lst.sort(key=lambda x:int(x[0])) #이때 데이터타입을 int로 꼭 지정해줘야 틀렸다고 안 나온다 ㅎ

for i in range(n):
    print(lst[i][0],lst[i][1]) #[i][0] / [i][1] i는 계속해서 늘어나야하고 0(나이) 1(이름)으로 고정시켜 주며 for 문으로 출력해준다.

- 기준을 잡는 것이 나이뿐이기 때문에 x[0]만 기준으로 잡아주면 된다. 위의 문제는 x값이 같을 때 y값을 기준으로 하기때문에 두개의 기준을 다 넣어주는데 이 경우엔 나이만 고려하고 나이가 같을 땐 등록 순으로 하기 때문에 그대로 넣어주면 된다. 


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

 

18870번: 좌표 압축

수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다. Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표의 개수와 같아야 한다. X1, X2, ..., XN에 좌

www.acmicpc.net

n = int(input())

lst = list(map(int,input().split()))

n_lst=list(sorted(set(lst))) #중복을 제거하면서 정렬해줌
n_lst = {n_lst[i]:i for i in range(len(n_lst))} #인덱스값이 답이기 때문

for i in lst:
    print(n_lst[i], end=" ") #인덱스 값을 출력해준다.