Skip to content

Commit 850f9fb

Browse files
authored
명환 숙제(07022021) (#95)
* 책 숙제 * 프로그래머스 숙제
1 parent 8466f8d commit 850f9fb

File tree

10 files changed

+317
-0
lines changed

10 files changed

+317
-0
lines changed

mhkim/programmers/가장큰수.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
"""
2+
@file 가장큰수.py
3+
@brief 정렬 - Level 2
4+
@desc
5+
6+
"""
7+
# 테스트 케이스 통과 / 시간 초과
8+
from functools import cmp_to_key
9+
from itertools import permutations as pt
10+
11+
12+
def solution1(numbers):
13+
cases = list(pt(numbers, len(numbers)))
14+
15+
l = []
16+
for c in cases:
17+
nums = list(map(str, c))
18+
num = ''.join(nums)
19+
l.append(num)
20+
21+
l.sort()
22+
return l[-1]
23+
24+
25+
# 앞자리가 큰 수 -> 앞자리 같을 경우 뒷자리순인데 자리수가 안맞으면 앞자리복사(3->33취급) 30 < 33 < 34 이렇게 비교하기 위해선?
26+
# 수가 1000이하
27+
def solution(numbers):
28+
# '0000' 예외처리
29+
# if max(numbers) == 0:
30+
# return '0'
31+
nums = sorted(list(map(str, numbers)), key=lambda x: x*4, reverse=True)
32+
return str(int(''.join(nums))) # int -> str : '0000'인 경우도 있기 때문에
33+
34+
35+
# 다른 풀이 (comparator)
36+
def comparator(a, b):
37+
t1 = a+b
38+
t2 = b+a
39+
# t1이 크다면 1 // t2가 크다면 -1 // 같으면 0
40+
return (int(t1) > int(t2)) - (int(t1) < int(t2))
41+
42+
43+
def solution2(numbers):
44+
n = [str(x) for x in numbers]
45+
n = sorted(n, key=cmp_to_key(comparator), reverse=True)
46+
answer = str(int(''.join(n)))
47+
return answer

mhkim/programmers/네트워크.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
"""
2+
@file 네트워크.py
3+
@brief DFS/BFS - Level 3
4+
@desc
5+
인구이동? 문제랑 비슷(연합국 갯수 구하는 방식) - 하위 문제 같음
6+
7+
"""
8+
from collections import deque
9+
10+
11+
def bfs(visited, computers, start):
12+
q = deque([start])
13+
visited[start] = True
14+
15+
while q:
16+
now = q.popleft()
17+
for i in range(len(computers[now])):
18+
if i != now and computers[now][i] == 1 and not visited[i]:
19+
visited[i] = True
20+
q.append(i)
21+
22+
23+
def solution(n, computers):
24+
visited = [False] * n
25+
nNet = 0
26+
for i in range(n):
27+
if not visited[i]:
28+
bfs(visited, computers, i)
29+
nNet += 1
30+
31+
return nNet

mhkim/programmers/소수찾기.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
"""
2+
@file 소수찾기.py
3+
@brief 완전탐색 - Level 2
4+
@desc
5+
소수 판별 / 순열->리스트
6+
"""
7+
8+
from itertools import permutations as pt
9+
import math
10+
11+
def isPrime(n):
12+
if n < 2:
13+
return False
14+
15+
for i in range(2, int(math.sqrt(n))+1):
16+
if n % i == 0:
17+
return False
18+
return True
19+
20+
def solution(numbers):
21+
nums = list(numbers)
22+
23+
prime = set()
24+
for i in range(1, len(numbers)+1):
25+
p = list(pt(nums, i))
26+
p = list(map(''.join, p))
27+
for num in set(p):
28+
if isPrime(int(num)):
29+
prime.add(int(num))
30+
31+
return len(prime)

mhkim/programmers/순위.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
"""
2+
@file 순위.py
3+
@brief 그래프 - Level 3
4+
@desc
5+
플로이드 워셜 알고리즘을 생각하지 못함
6+
"""
7+
8+
9+
def floydWarshall(graph, n):
10+
for k in range(n+1):
11+
for i in range(n+1):
12+
for j in range(n+1):
13+
# i선수가 k선수를 이기고 k선수가 j선수를 이기면 i선수는 j선수를 이긴 것
14+
if graph[i][k] == 1 and graph[k][j] == 1:
15+
graph[i][j] = 1
16+
# i선수가 k선수에게 지고 k선수가 j선수에게 졌으면 i선수는 j선수에게 진 것
17+
elif graph[i][k] == -1 and graph[k][j] == -1:
18+
graph[i][j] = -1
19+
20+
21+
def solution(n, results):
22+
winlose = [[0 for _ in range(n+1)] for _ in range(n+1)] # 승부 모르면 0
23+
for w, l in results:
24+
# 승리 1, 패배 -1
25+
winlose[w][l] = 1
26+
winlose[l][w] = -1
27+
28+
# floyd-warshall
29+
floydWarshall(winlose, n)
30+
31+
# n-1번 대결한(플로이드 워셜 결과) 선수는 순위가 확정
32+
answer = 0
33+
for wl in winlose:
34+
if wl.count(-1) + wl.count(1) == n-1:
35+
answer += 1
36+
37+
return answer
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
"""
2+
@file 전화번호목록.py
3+
@brief 해시 - Level 2
4+
@desc
5+
트라이 구조 생각했는데 구현 빡셈
6+
7+
첫 문제 풀이 -> 효율성 테스트 모두 실패
8+
두 번째 문제 풀이 -> 딕셔너리 자료구조 활용
9+
+) 다른 사람 풀이 중 제일 간단한 것
10+
"""
11+
12+
# v1 : O(N^2) / 효율성 테스트 실패
13+
def solution1(phone_book):
14+
answer = True
15+
16+
length = len(phone_book)
17+
for i in range(length):
18+
for j in range(length):
19+
if i != j:
20+
if phone_book[i].startswith(phone_book[j]):
21+
answer = False
22+
break
23+
24+
return answer
25+
26+
27+
# v2
28+
def solution(phone_book):
29+
answer = True
30+
31+
prefixes = dict()
32+
for pb in phone_book:
33+
for i in range(len(pb)):
34+
prefix = pb[0:i+1]
35+
if prefix in prefixes:
36+
prefixes[prefix] += 1
37+
else:
38+
prefixes[prefix] = 0
39+
40+
for pb in phone_book:
41+
if prefixes[pb] >= 1:
42+
answer = False
43+
break
44+
45+
return answer
46+
47+
# 다른 사람 풀이
48+
def solution3(phoneBook):
49+
phoneBook = sorted(phoneBook)
50+
51+
for p1, p2 in zip(phoneBook, phoneBook[1:]):
52+
if p2.startswith(p1):
53+
return False
54+
return True
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
"""
2+
@file 정수삼각형.py
3+
@brief DP - Level 3
4+
@desc
5+
바텀업
6+
"""
7+
8+
9+
# d[i][j] : i행 j열까지의 가장 큰 합
10+
def solution(triangle):
11+
d = [[0 for j in range(i+1)] for i in range(len(triangle))]
12+
d[0] = triangle[0]
13+
for i in range(1, len(triangle)):
14+
for j in range(i+1):
15+
if j == 0:
16+
d[i][j] = d[i-1][j] + triangle[i][j]
17+
elif j == i:
18+
d[i][j] = d[i-1][j-1] + triangle[i][j]
19+
else:
20+
d[i][j] = max(d[i-1][j-1], d[i-1][j]) + triangle[i][j]
21+
22+
return max(d[len(triangle)-1])

mhkim/programmers/프린터.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
"""
2+
@file 프린터.py
3+
@brief 프로그래머스 스택/큐 - Level 2
4+
@desc
5+
우선순위를 보고 heapq면 어떨까 했는데 heapify는 문제의 우선순위 보장을 못함
6+
큐 2개 - 1. 우선순위 체킹 / 2. 타겟 검출
7+
"""
8+
from collections import deque
9+
10+
11+
def solution(priorities, location):
12+
targetPriority = priorities[location]
13+
14+
sortedPriorities = sorted(priorities, reverse=True)
15+
sortedQ = deque(sortedPriorities) # 우선순위 체킹 위해서
16+
17+
q = deque()
18+
for i in range(len(priorities)):
19+
q.append((priorities[i], i))
20+
21+
cnt = 1
22+
while q:
23+
p, idx = map(int, q[0])
24+
25+
if p < sortedQ[0]:
26+
q.append(q.popleft())
27+
else:
28+
if targetPriority == sortedQ[0]:
29+
if idx == location:
30+
break
31+
else:
32+
q.append(q.popleft())
33+
cnt += 1
34+
else:
35+
cnt += 1
36+
q.popleft()
37+
sortedQ.popleft()
38+
39+
return cnt

mhkim/sort-23.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
"""
2+
@file sort-23.py
3+
@brief 국영수 (백준)
4+
@desc
5+
우선순위 함수 만들기
6+
"""
7+
8+
import sys
9+
10+
n = int(sys.stdin.readline().rstrip())
11+
12+
students = []
13+
for i in range(n):
14+
student = list(sys.stdin.readline().rstrip().split())
15+
students.append([student[0], int(student[1]), int(student[2]), int(student[3])])
16+
17+
students.sort(key=lambda x: (-x[1], x[2], -x[3], x[0]))
18+
19+
for student in students:
20+
print(student[0])

mhkim/sort-24.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
"""
2+
@file sort-24.py
3+
@brief 안테나
4+
@desc 수학+정렬
5+
"""
6+
import sys
7+
8+
n = int(sys.stdin.readline().rstrip())
9+
10+
positions = list(map(int, sys.stdin.readline().rstrip().split()))
11+
12+
positions.sort()
13+
print(positions[(n-1)//2])

mhkim/sort-25.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
"""
2+
@file sort-25.py
3+
@brief 카드 정렬하기
4+
@desc 힙
5+
"""
6+
import sys
7+
import heapq
8+
input = sys.stdin.readline
9+
10+
n = int(input())
11+
12+
bundle = []
13+
for i in range(n):
14+
heapq.heappush(bundle, int(input()))
15+
16+
cnt = 0
17+
while len(bundle) > 1:
18+
first = heapq.heappop(bundle)
19+
second = heapq.heappop(bundle)
20+
cnt += first+second
21+
heapq.heappush(bundle, first + second)
22+
23+
print(cnt)

0 commit comments

Comments
 (0)