Skip to content

명환 숙제(07022021) #95

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Aug 10, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 47 additions & 0 deletions mhkim/programmers/가장큰수.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
"""
@file 가장큰수.py
@brief 정렬 - Level 2
@desc

"""
# 테스트 케이스 통과 / 시간 초과
from functools import cmp_to_key
from itertools import permutations as pt


def solution1(numbers):
cases = list(pt(numbers, len(numbers)))

l = []
for c in cases:
nums = list(map(str, c))
num = ''.join(nums)
l.append(num)

l.sort()
return l[-1]


# 앞자리가 큰 수 -> 앞자리 같을 경우 뒷자리순인데 자리수가 안맞으면 앞자리복사(3->33취급) 30 < 33 < 34 이렇게 비교하기 위해선?
# 수가 1000이하
def solution(numbers):
# '0000' 예외처리
# if max(numbers) == 0:
# return '0'
nums = sorted(list(map(str, numbers)), key=lambda x: x*4, reverse=True)
return str(int(''.join(nums))) # int -> str : '0000'인 경우도 있기 때문에


# 다른 풀이 (comparator)
def comparator(a, b):
t1 = a+b
t2 = b+a
# t1이 크다면 1 // t2가 크다면 -1 // 같으면 0
return (int(t1) > int(t2)) - (int(t1) < int(t2))


def solution2(numbers):
n = [str(x) for x in numbers]
n = sorted(n, key=cmp_to_key(comparator), reverse=True)
answer = str(int(''.join(n)))
return answer
31 changes: 31 additions & 0 deletions mhkim/programmers/네트워크.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
"""
@file 네트워크.py
@brief DFS/BFS - Level 3
@desc
인구이동? 문제랑 비슷(연합국 갯수 구하는 방식) - 하위 문제 같음

"""
from collections import deque


def bfs(visited, computers, start):
q = deque([start])
visited[start] = True

while q:
now = q.popleft()
for i in range(len(computers[now])):
if i != now and computers[now][i] == 1 and not visited[i]:
visited[i] = True
q.append(i)


def solution(n, computers):
visited = [False] * n
nNet = 0
for i in range(n):
if not visited[i]:
bfs(visited, computers, i)
nNet += 1

return nNet
31 changes: 31 additions & 0 deletions mhkim/programmers/소수찾기.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
"""
@file 소수찾기.py
@brief 완전탐색 - Level 2
@desc
소수 판별 / 순열->리스트
"""

from itertools import permutations as pt
import math

def isPrime(n):
if n < 2:
return False

for i in range(2, int(math.sqrt(n))+1):
if n % i == 0:
return False
return True

def solution(numbers):
nums = list(numbers)

prime = set()
for i in range(1, len(numbers)+1):
p = list(pt(nums, i))
p = list(map(''.join, p))
for num in set(p):
if isPrime(int(num)):
prime.add(int(num))

return len(prime)
37 changes: 37 additions & 0 deletions mhkim/programmers/순위.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
"""
@file 순위.py
@brief 그래프 - Level 3
@desc
플로이드 워셜 알고리즘을 생각하지 못함
"""


def floydWarshall(graph, n):
for k in range(n+1):
for i in range(n+1):
for j in range(n+1):
# i선수가 k선수를 이기고 k선수가 j선수를 이기면 i선수는 j선수를 이긴 것
if graph[i][k] == 1 and graph[k][j] == 1:
graph[i][j] = 1
# i선수가 k선수에게 지고 k선수가 j선수에게 졌으면 i선수는 j선수에게 진 것
elif graph[i][k] == -1 and graph[k][j] == -1:
graph[i][j] = -1


def solution(n, results):
winlose = [[0 for _ in range(n+1)] for _ in range(n+1)] # 승부 모르면 0
for w, l in results:
# 승리 1, 패배 -1
winlose[w][l] = 1
winlose[l][w] = -1

# floyd-warshall
floydWarshall(winlose, n)

# n-1번 대결한(플로이드 워셜 결과) 선수는 순위가 확정
answer = 0
for wl in winlose:
if wl.count(-1) + wl.count(1) == n-1:
answer += 1

return answer
54 changes: 54 additions & 0 deletions mhkim/programmers/전화번호목록.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
"""
@file 전화번호목록.py
@brief 해시 - Level 2
@desc
트라이 구조 생각했는데 구현 빡셈

첫 문제 풀이 -> 효율성 테스트 모두 실패
두 번째 문제 풀이 -> 딕셔너리 자료구조 활용
+) 다른 사람 풀이 중 제일 간단한 것
"""

# v1 : O(N^2) / 효율성 테스트 실패
def solution1(phone_book):
answer = True

length = len(phone_book)
for i in range(length):
for j in range(length):
if i != j:
if phone_book[i].startswith(phone_book[j]):
answer = False
break

return answer


# v2
def solution(phone_book):
answer = True

prefixes = dict()
for pb in phone_book:
for i in range(len(pb)):
prefix = pb[0:i+1]
if prefix in prefixes:
prefixes[prefix] += 1
else:
prefixes[prefix] = 0

for pb in phone_book:
if prefixes[pb] >= 1:
answer = False
break

return answer

# 다른 사람 풀이
def solution3(phoneBook):
phoneBook = sorted(phoneBook)

for p1, p2 in zip(phoneBook, phoneBook[1:]):
if p2.startswith(p1):
return False
return True
22 changes: 22 additions & 0 deletions mhkim/programmers/정수삼각형.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
"""
@file 정수삼각형.py
@brief DP - Level 3
@desc
바텀업
"""


# d[i][j] : i행 j열까지의 가장 큰 합
def solution(triangle):
d = [[0 for j in range(i+1)] for i in range(len(triangle))]
d[0] = triangle[0]
for i in range(1, len(triangle)):
for j in range(i+1):
if j == 0:
d[i][j] = d[i-1][j] + triangle[i][j]
elif j == i:
d[i][j] = d[i-1][j-1] + triangle[i][j]
else:
d[i][j] = max(d[i-1][j-1], d[i-1][j]) + triangle[i][j]

return max(d[len(triangle)-1])
39 changes: 39 additions & 0 deletions mhkim/programmers/프린터.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
"""
@file 프린터.py
@brief 프로그래머스 스택/큐 - Level 2
@desc
우선순위를 보고 heapq면 어떨까 했는데 heapify는 문제의 우선순위 보장을 못함
큐 2개 - 1. 우선순위 체킹 / 2. 타겟 검출
"""
from collections import deque


def solution(priorities, location):
targetPriority = priorities[location]

sortedPriorities = sorted(priorities, reverse=True)
sortedQ = deque(sortedPriorities) # 우선순위 체킹 위해서

q = deque()
for i in range(len(priorities)):
q.append((priorities[i], i))

cnt = 1
while q:
p, idx = map(int, q[0])

if p < sortedQ[0]:
q.append(q.popleft())
else:
if targetPriority == sortedQ[0]:
if idx == location:
break
else:
q.append(q.popleft())
cnt += 1
else:
cnt += 1
q.popleft()
sortedQ.popleft()

return cnt
20 changes: 20 additions & 0 deletions mhkim/sort-23.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
"""
@file sort-23.py
@brief 국영수 (백준)
@desc
우선순위 함수 만들기
"""

import sys

n = int(sys.stdin.readline().rstrip())

students = []
for i in range(n):
student = list(sys.stdin.readline().rstrip().split())
students.append([student[0], int(student[1]), int(student[2]), int(student[3])])

students.sort(key=lambda x: (-x[1], x[2], -x[3], x[0]))

for student in students:
print(student[0])
13 changes: 13 additions & 0 deletions mhkim/sort-24.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
"""
@file sort-24.py
@brief 안테나
@desc 수학+정렬
"""
import sys

n = int(sys.stdin.readline().rstrip())

positions = list(map(int, sys.stdin.readline().rstrip().split()))

positions.sort()
print(positions[(n-1)//2])
23 changes: 23 additions & 0 deletions mhkim/sort-25.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
"""
@file sort-25.py
@brief 카드 정렬하기
@desc 힙
"""
import sys
import heapq
input = sys.stdin.readline

n = int(input())

bundle = []
for i in range(n):
heapq.heappush(bundle, int(input()))

cnt = 0
while len(bundle) > 1:
first = heapq.heappop(bundle)
second = heapq.heappop(bundle)
cnt += first+second
heapq.heappush(bundle, first + second)

print(cnt)