🧩 Programming Languages/Python CodingTest

백준 정렬 문제 모음(2587, 25305, 2751, 1427, 11650, 11651, 1181)

복숭아아이스티에샷추가 2024. 1. 8. 19:00
 

2587번: 대표값2

어떤 수들이 있을 때, 그 수들을 대표하는 값으로 가장 흔하게 쓰이는 것은 평균이다. 평균은 주어진 모든 수의 합을 수의 개수로 나눈 것이다. 예를 들어 10, 40, 30, 60, 30의 평균은 (10 + 40 + 30 + 60 +

www.acmicpc.net


 

 내가 작성한 코드 

nums = []
sum = 0
for _ in range(5):
    num = int(input())
    sum += num
    nums.append(num)

print(sum/5)
nums.sort()
print(nums[2])

 

8번째 줄에 / 를 하나만 썼더니 소수점이 나왔다. 그래서 수정.

 

 8번째 줄 수정 

print(sum//5)

 

 


 

 

25305번: 커트라인

시험 응시자들 가운데 1등은 100점, 2등은 98점, 3등은 93점이다. 2등까지 상을 받으므로 커트라인은 98점이다.

www.acmicpc.net


 

 내가 작성한 코드 

n, k = map(int, input().split())
score = list(map(int, input().split()))
score.sort(reverse=True)
print(score[k-1])

 

문제 없이 바로 정답

 


 

2751번: 수 정렬하기 2

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

www.acmicpc.net

 

문제를 읽어보니 앞서 푼 정렬 문제와 다를 것이 없어서 왜 실버 등급이지? 의문이 들었다가...

 

Aㅏ...


 

 내가 작성한 코드 

n = int(input())
nums = []
for _ in range(n):
    num = int(input())
    nums.append(num)

nums.sort()

for i in range(n):
	print(nums[i])

 

우선 내가 먼저 작성한 코드는 위와 같다. 계속 시간 초과가 되길래 이것저것 수정해보았지만 결과는 같았다.

그래서 어쩔 수 없이 검색하여 알아보니 input 대신 sys.stdin.readline 을 이용하여 입력받아야한다는 것을 알았다.

 

 수정한 코드 

import sys

n = int(input())
nums = []
for _ in range(n):
    num = int(sys.stdin.readline())
    nums.append(num)

nums.sort()

for i in range(n):
    print(nums[i])

 

입력받는 코드만 바꾸었더니 바로 정답 처리되었다.

 

  input vs sys.stdin.readline  

 

input 은 한 두줄 입력받을 때는 괜찮다.

하지만 여러 줄에 걸쳐 (특히 for문을 사용해서) 입력받을 때는 시간초과가 일어난다.

그래서 이러한 상황에서는 sys.stdin.readline 을 사용하는 것이 더 낫다.

 

전에 다른 문제를 풀 때도 이 둘의 차이 때문에 골치 아픈 적이 있었는데 다시 짚고 넘어가야겠다.

 

차이점 1. 인자로 prompt messange 을 받을 수 있는지에 대한 여부

:

n = input("숫자를 입력하세요: ")

는 가능

n = sys.stdin.readline("숫자를 입력하세요: ")

는 에러

 

차이점 2. 빈 문자열 입력 가능 여부

: 빈 문자열을 입력하여 출력한다면

input 은 에러를, sys.stdin.readline 은 빈 문자열을 출력한다. 

 

차이점 3. 개행문자 여부

: 숫자 1을 입력하면, input은 1 그대로,

sys.stdin.readline 은 1\n 을 입력받는다. 데이터를 한 줄 단위로 입력받기 때문이다.

 

따라서 반복해서 입력받을 수록 둘의 수행시간은 더욱 차이 날 것이다.

다음부터는 3번 이상 입력받아야할 때는 sys.stdin.readline 을 사용해야겠다.

 

 

 조금 더 다듬은 코드 

import sys

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

nums.sort()

for num in nums:
    print(num)

 

n개 줄에 걸쳐 입력받고 리스트에 넣는 코드를 2줄로 작성하였는데, 그것을 한 줄로 고쳤다.

그리고 출력하는 코드도 조금 더 간결하게 수정하였다.

 


 

 

1427번: 소트인사이드

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

www.acmicpc.net

 


 수정한 코드 

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

while True:
    if num != 0:
        nums.append(num%10)
        num = num // 10
    else:
        break

nums.sort(reverse=True)

for num in nums:
    print(num, end='')

 

입력받은 수의 각 자릿수는 10을 계속 나누면서, 몫과 나머지를 이용하여 구하였다.

 

예를 들어, 419를 10으로 나누면 몫은 41, 나머지는 9이다.

그리고 다시 41을 10으로 나누면 몫은 4, 나머지는 1이다.

4를 10으로 나누려고 하면 몫은 0, 나머지는 4이다.

 

각 자릿수는 나머지로 알아낼 수 있으므로, 리스트에 넣었다.

그리고 몫이 0이 될 때 break 하는 조건으로 코드를 작성하였다.

 

실버 등급 문제지만 큰 어려움 없이 바로 통과하였다.

 


 

 

11650번: 좌표 정렬하기

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

www.acmicpc.net

 


 

 내가 작성한 코드 

import sys

n = int(input())

co = [list(map(int, sys.stdin.readline().split())) for _ in range(n)]

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

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

 

 

리스트 특정 요소를 기준으로 정렬하는 방법만 어떻게 구현하는지 몰라서 서치하였다.

만약 오름차순으로 하고싶다면 아래와 같이 - 를 추가해주면 된다.

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

 


 

 

11651번: 좌표 정렬하기 2

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

www.acmicpc.net

 

바로 위에서 푼 11650문제는 정렬하는 기준이 x좌표를 기준으로 하고, 만약 x좌표가 같다면 y좌표를 그 다음 기준으로 정렬하는 문제였는데,

11651문제는 그와 반대로 y좌표 -> x좌표 순서로 기준을 잡아 정렬해야한다.

 

즉, 4번째 줄 코드만 아래와 같이 수정하니 바로 정답 처리되었다.

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

 

 


 

 

1181번: 단어 정렬

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

www.acmicpc.net

 


 

 내가 작성한 코드 

import sys

n = int(input())
words = []
for _ in range(n):
    word = sys.stdin.readline().rstrip()
    if word not in words:
        words.append(word)

words.sort(key = len)
words.sort()

for word in words:
    print(word)

 

문제 조건에는 단어의 개수를 먼저 기준으로 내림차순을 한 후, 개수가 같다면 사전처럼 내림차순 해야한다고 나와있어서

그대로 코드를 작성하였는데 오답으로 나왔다. 

vs코드로 확인해보니 앞서 정렬한 개수는 무시되고 다시 사전 순으로 뒤죽박죽 섞여서 출력됨을 확인할 수 있었다.

 

그래서 사전순으로 먼저 정렬한 뒤, 단어 개수를 그 다음에 정렬하는 방식으로 아래와 같이 코드를 수정하였다.

 

 

 수정한 코드 

words.sort()
words.sort(key = len)

 

정답!

 

 


 

오늘의 한줄평 : 최근 2~3주간 문제를 못 풀다가 다시 하루에 1~2개는 풀자고 목표로 삼고, 열심히 공부하려고 했는데 오늘 어쩌다보니 꽤 많이 풀었다. 별다른 스케쥴이 없어서 그런가? 역시 코딩은 필 받는 날이 따로 있나보다