🧐 백준 1427 (단일 숫자 분리하기)

🤫  solution_1427

num_str_list = list(input())  # ['5', '0', '0', '6', '1', '3', '0', '0', '9']
print(*sorted(num_str_list, reverse = True), sep = "")

2143 => 1234처럼 만들어야 하므로 먼저 str로 받고 원소 각각을 비교하면 된다.

 

🧐 백준 2108 (통계학 _ statistics 라이브러리 이용)

🤫 해결의 실마리 

🤔 수학 통계 내장함수 statistics (https://python.flowdas.com/library/statistics.html)
이 문제의 경우, 최빈값을 구하기 위해 count함수를 사용하게 될 경우, 이로 인해 시간초과가 걸리게 된다.

따라서 아래의 통계학관련 statistics 라이브러리의 multimode()함수를 이용해 최빈값을 구해준다.



🤫  solution_2108

import statistics as st

num = [int(input()) for _ in range(int(input()))]

mode =st.multimode(num)
if len(mode) > 1:
    mode.remove(min(mode))

print(int(sum(num)/len(num)))
print(round(st.median(num)))
print(min(mode))
print(max(num) - min(num))

 

 

 

🧐 백준 10814,11650, 11651 (C++의 pair와 같은 자료구조가 필요해!

🤫 해결의 실마리 1. python의 sort는 stable 정렬을 한다.

파이썬은 기본적으로 stable_sort이기에 나이 기준 정렬을 해도 가입한 순서는 그대로!

🤫 해결의 실마리 2.  2차원 리스트의 경우, 하나의 for문으로 접근할 수 있다! 

파이썬은 다음과 같이 2차원 배열의 경우, 한번에 요소에 접근할 수 있다.
arr = list(input().split() for _ in range(int(input())))

for x, y in arr:
    print(x, y)  => arr[0][0], arr[0][1]


🤔 Algorithm 과정 
굳이 int로 받지 않아도 어차피 '20' < '21' 이므로 정렬한 person리스트를 for문을 이용해 접근한다.
이때, 정렬할 때, key = lambda식을 이용해 a[0], 즉 나이를 기준으로 정렬하는 방법을 사용한다.
 

🤫  solution_10814

# 파이썬의 sort함수는 기본적으로 stable정렬을 한다.

person = list(input().split() for _ in range(int(input())))

# str로 받아도 원소값을 int로 받아 비교가 가능하다.
for x, y in sorted(person, key = lambda a: int(a[0])):
    print(x, y)
10814와 마찬가지로 해결 

🤫  solution_11650

num = [list(map(int, input().split())) for _ in range(int(input()))]
# num에는 다음과 같은 형태로 저장됨
# [[3, 4], [1, 1], [1, -1], [2, 2], [3, 3]]

# for문으로 2차원 리스트 요소 출력
# [1, -1] [1, 1] [2, 2] [3, 3] [3, 4]
for x, y in sorted(num):
    print(x, y)

🤫  solution_11651

num = [list(map(int, input().split())) for _ in range(int(input()))]

# 맨 뒤의 원소 a[1]을 기준으로 정렬 후 a[0]을 기준으로 정렬
for x, y in sorted(num, key = lambda a: (a[1], a[0])):
    print(x, y)

단, 이 문제에서 유의할 점은 python은 정렬에서 기준 여러 개 세울 수 있다는 점이다. 위에서 처럼 말이다.

# 맨 뒤의 원소 a[1]을 기준으로 정렬 후 a[0]을 기준으로 정렬
sorted(num, key = lambda a: (a[1], a[0])):

 

🧐 백준 18870 (메모리에 대한 접근)

🤫 해결의 실마리 1. 메모리 제한이 여유롭다??

🤔 이 문제는 메모리 제한이 512MB로 여유로운데, 이에 대해 살펴볼 필요가 있다.
-
메모리 제한이 많음 = 순서를 따로 저장(hash)하지 않으면 시간초과가 발생할 것이라 유추
- 순서만 간단히 비교하면 되기에 set으로 중복을 없애고 sort를 진행하면 더 간단히 해결 가능.
🤔사실 문제에서 말하는 바는 등수를 출력하는 것과 동일!

🤫 해결의 실마리 2. 딕셔너리 자료구조

🤔 Dictionary.
- 
key-value 형태로 이루어진 자료구조로 값과 데이터의 대응관계를 표현할 때, powerful하다.
- 이때, 핵심은 key값은 중복될 수 없다는 점이며 아래의 코드를 예시로 들어 보겠다.
# x_set에는 [-10, -9, 2, 4] 원소가 들어가있는 set리스트이다.

x_dict = {x_set[i] : i for i in range(len(x_set))}

#x_dict = { -10: 0, -9: 1, 2: 2, 4: 3 }
# print(x_dict[-9])  # key값을 이용한 value, 1 출력




🤔 Algorithm 과정 
1. 입력값을 저장하는 x리스트와
2. x리스트의 원소들이 겹치지 않도록 set을 만들어 정렬시켜준다.
3. 오름차순 정렬이 된 set에 index를 맵핑해주면 그것이 비로소 순위가 되므로
4. set_element  :  index의 맵핑을 위해 딕셔너리를 사용해준다.
5. 그 후 x리스트를 돌면서 해당 원소와 일치하는 값과 맵핑한 딕셔너리의 value값(인덱스, 순위 값)을 출력

 

🤫  solution_18870 (시간초과)

N = int(input())
x = list(map(int, input().split()))
x_prime = []

for i in x:
    cnt = 0
    for j in set(sorted(x)):
        if i > j:
            cnt += 1
    x_prime.append(cnt)
print(*x_prime)

처음 짠 코드로 문제점은 이중 for문을 이용하여 if문을 2번 돌리면 시간복잡도가 O(n^2)이다.
이 문항의 경우 시간복잡도가 O(nlog n)의 정렬 알고리즘이 필요하다.


🤫  solution_18870

N = int(input())
x = list(map(int, input().split()))
x_set = sorted(list(set(x)))
x_prime = []

# x_set의 [-10, -9, 2, 4]에 index를 맵핑하여 딕셔너리로(순위)
# cf. 딕셔너리는 해시를 이용해 데이터 저장
x_dict = {x_set[i] : i for i in range(len(x_set))}
#x_dict = {-10: 0, -9: 1, 2: 2, 4: 3}
# print(x_dict[-9])  # 1 출력


for i in x:
    print(x_dict[i], end = " ")
 

🧐 백준 1427, 1676, 2577, 2711  _ 단일 숫자에 대한 리스트를 이용한 접근

🤫 해결의 실마리 

🤔 단일숫자나 문자열에 대한 접근이나 리스트로 어떻게 바꿀까?

🙃 단일 숫자의 경우는 다음과 같다.
1. 단일 숫자를 문자열로 바꾼다.
2. 문자열을 리스트에 넣는다.
str_num = str(n)
str_list = list(str_num)​

🙃 문제에 맞는 연산 진행 후 다시 숫자로 출력하고 싶다면?
3. 리스트값들을 출력
print(*sorted(num, reverse = True) , sep = '')
# sep=''를 통해 원소간의 구분자인 공백을 없애줌으로
# 9 9 9 9 9 9 9 9 8 을
# 999999998 로 출력​


🧐 사용법에 대한 정리.

num = int(input())
str_x = list(str(num))          # ['1', '2', '3', '4', '5', '6']
int_x = list(map(int, str_x))   # [1, 2, 3, 4, 5, 6]

print(*int_x)           # 1 2 3 4 5 6
print(*int_x, sep="")   # 123456


 
🤔  원하는 원소를 어떻게 지울까?  pop, del, remove 함수! 
# cf-1  pop
a = [1,2,1,3,4,5,1]
removed = a.pop(1)  # 1번째 index 삭제 단, return 가능

print(a)            # [1, 1, 3, 4, 5, 1]
print(removed)      # 2   <-- pop한 원소를 return 가능
# cf-2  del  -> pop과 다르게 리스트의 범위를 지정해 삭제 가능
a = [1,2,1,3,4,5,1]

del a[:2]
print(a)        # [1, 3, 4, 5, 1]
#cf-3   remove  -> 위와 달리 지우고자 하는 인덱스가 아닌 값을 입력
for _ in numbers :
    numbers.remove(3)




🤫  solution_1427

# 입력: 999998999

num = list(map(int, input()))  # 공백없이 입력받을 때, list에 저장하는 법
print(*sorted(num, reverse = True) , sep = '')
# sep=''를 통해 원소간의 구분자인 공백을 없애줌으로
# 9 9 9 9 9 9 9 9 8 을
# 999999998 로 출력

# cf. end옵션을 사용하면 그 뒤에 나오는 출력값과 구분을 짓는 구분자 역할을 한다.
print(*sorted(num, reverse = True) , end = " hello ")
print(num)
# 9 9 9 9 9 9 9 9 8 hello [9, 9, 9, 9, 9, 8, 9, 9, 9] 가 출력


🤫  solution_1676

def fac(n):
    if n <= 1:
        return 1
    else:
        return n * fac(n - 1)

N = int(input())
n = fac(N)

# 숫자를 리스트에 한자리씩 넣기 (숫자->문자열)
str_num = str(n)
str_list = list(str_num)

cnt = 0
for i in reversed(str_list):
    if i == '0':
        cnt += 1
    else:
        break
print(cnt)

 

🤫  solution_2577

num = []
for i in range(3):
    n = int(input())
    num.append(n)

mul = 1
for i in range(3):
    mul *= num[i]

str_x = list(str(mul))
int_x = list(map(int, str_x))

out_ls = []
for i in range(10):
    out_ls.append(int_x.count(i))

for i in range(10):
    print(out_ls[i])

 

 

🧐 백준 1292 , 4458 풀이 및 사용함수

🤫 해결의 실마리 

🤔 리스트 사용의 핵심! 인덱스 슬라이싱 
인덱스 슬라이싱에 대한 응용방법을 아래 해설을 통해 볼 수 있는데, [:]를 이용한다.



🤫  solution_1292

A, B = map(int, input().split())
num_sequences = []

for i in range(1000):
    for j in range(i):
        num_sequences.append(i
print(sum(num_sequences[A-1:B]))


🤫  solution_4458

for i in [input() for _ in range(int(input()))]:
    print(i[:1].upper() + i[1:])

 

 

 

🧐 백준 1157  풀이 및 사용 함수

🤫 해결의 실마리 

🤔 원소가 겹치지 않아? set 자료구조 
주로 사용하는 리스트로 set을 변환하는 방법은 다음과 같다.
a_set = set(a)
lst = []
for i in a_set:
    lst.append(a.count(i))


🤫  solution_1546

a = list(str(input()).upper())
a_set = set(a)
cnt = []
for i in a_set:
    cnt.append(a.count(i))
if cnt.count(max(cnt)) <= 1:
    print(max(a, key = a.count))
else:
    print("?")

 

🧐 백준 1292 , 4458 풀이 및 사용함수

🤫 해결의 실마리 

🤔 리스트 사용의 핵심! 인덱스 슬라이싱 
인덱스 슬라이싱에 대한 응용방법을 아래 해설을 통해 볼 수 있는데, [:]를 이용한다.



🤫  solution_1292

A, B = map(int, input().split())
num_sequences = []

for i in range(1000):
    for j in range(i):
        num_sequences.append(i
print(sum(num_sequences[A-1:B]))


🤫  solution_4458

for i in [input() for _ in range(int(input()))]:
    print(i[:1].upper() + i[1:])

 

🧐 백준 2309,  2822 풀이 및 사용함수

🤫 해결의 실마리 

🤔 정렬을 스스로 해주는 내장함수, sorted를 이용하자! 

정렬 함수는 다음 2가지를 사용할 수 있다.

a.sort()
sorted(a)

둘의 차이는 바로 반환의 여부이다.
a.sort의 경우, 반환을 해주지 않기에 print문에 넣어주면 오류가 발생하게 된다.
하지만 sorted의 경우, 값의 반환이 이루어질 수 있어서 print문에서도 오류가 발생하지 않는다.


🤔 cf. 출력 조건에 따라 다음과 같이 작성하자!
sorted(idx_list)  => [3, 4, 5, 6, 8]
*sorted(idx_list) =>   3 4 5 6 8


🤫  solution_2309

dwarf = [int(input()) for _ in range(9)]

for i in range(len(dwarf)):
    for j in range(i+1, len(dwarf)):
        if (sum(dwarf) - (dwarf[i] + dwarf[j])) == 100:
            dwarf1, dwarf2 = dwarf[j], dwarf[i]  # out of index range 조심
            dwarf.remove(dwarf1)
            dwarf.remove(dwarf2)
            break
        else:
            continue

print(*sorted(dwarf), sep = "\n")

 

🤫  solution_2822

score = [int(input()) for _ in range(8)]
total = list(sorted(score, reverse=True))
print(sum(total[:5]))

idx_list = []
for i in range(5):
    idx_list.append(score.index(max(score)) + 1)
    score[score.index(max(score))] = -100
print(*sorted(idx_list))
# sorted(idx_list)  => [3, 4, 5, 6, 8]
# *sorted(idx_list) =>   3 4 5 6 8

 

 

🧐 백준 11047 풀이

🤫  solution_11047  (Greedy Algorithm)

N, K = map(int, input().split())

coin = sorted([int(input()) for _ in range(N)], reverse=True)

cnt = 0
while K != 0:
    for i in range(N):
        if coin[i] > K:
            i -= 1
        else:
            frequency = K // coin[i]
            K -= coin[i] * frequency
            cnt += frequency
print(cnt)

 

+ Recent posts