Skip to content

승연 프로그래머스 숙제 (7/1/목) #92

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 9 commits into from
Jul 2, 2021
84 changes: 84 additions & 0 deletions syheo/programmers/가장 큰 수.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
#프로그래머스
#고득점 Kit
#그래프
#level2
#가장 큰 수

# level2 지만
# 굉장히 어려웠다.
# 일단 커스텀해야되는 정렬조건(단순한 대소 비교가 아닌)을 정렬에 적용해야 된다는 점
# cmp_to_key 가 있다는 사실도 처음 알게 되었고
# 물론 나는 퀵정렬을 직접 구현하여 했지만
# 퀵정렬이 장착된 기본 정렬 함수를 사용해도 된다
# 또한 신박한 코드를 봤다
'''
def solution(numbers):
numbers = list(map(str, numbers))
numbers.sort(key=lambda x: x*3, reverse=True)
return str(int(''.join(numbers)))
'''
# 요 코드인데 이걸 어떻게 생각했을지 .. 대단하다
# 아무튼 중요한 문제인듯!!


def sort_key(a,b):
if int(str(a)+str(b))>int(str(b)+str(a)):
return True
else:
return False

def quick_sort(array):
#리스트가 하나 이하의 원소만을 담고 있다면 종료
if len(array) <= 1:
return array

pivot = array[0] #피벗은 첫 번째 원소
tail = array[1:] #피벗을 제외한 리스트

left_side = [x for x in tail if not sort_key(x,pivot)] # 분할된 왼쪽 부분
right_side = [x for x in tail if sort_key(x,pivot)] # 분할된 오른쪽 부분

#분할 이후 왼쪽 부분과 오른쪽 부분에서 각각 정렬을 수행하고, 전체 리스트를 반환
return quick_sort(left_side) + [pivot] + quick_sort(right_side)

def solution(numbers):
answer = ''
numbers = list(reversed(quick_sort(numbers)))
while len(numbers)>1 and numbers[0]==0:
numbers=numbers[1:]
return ''.join(list(map(str,numbers)))

# 풀이 2 #

def sort_key(a,b):
return (a,b) if int(str(a)+str(b))>int(str(b)+str(a)) else (b,a)


def solution2(numbers):
answer = ''
length = len(numbers)

for i in range(length):
for j in range(i+1,length):
numbers[i],numbers[j] = sort_key(numbers[i],numbers[j])

#print(numbers)
answer = ''.join(list(map(str,numbers)))

return answer

# 풀이 3 #

def solution3(numbers):
answer = ''

numbers.sort(reverse=True,key = lambda x: (str(x)[0],str(x)[1] if len(str(x))>1 else str(x)[0],str(x)[2] if len(str(x))>2 else str(x)[0],str(x)[3] if len(str(x))>3 else str(x)[0]))

for i in range(len(list(map(str,numbers)))):
if answer == '' and numbers[i]==0:
pass
else:
answer += ''.join(str(numbers[i]))


return answer
28 changes: 28 additions & 0 deletions syheo/programmers/네트워크.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
#프로그래머스
#고득점 Kit
#dfs/bfs
#level3
#네트워크

from collections import deque

def bfs(node,n,computers,visited):
rst = 0
q = deque([node])
while q:
v = q.popleft()
for i in range(n):
if computers[v][i]==1 and not visited[i]:
visited[i]=True
q.append(i)
rst+=1
return rst

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

return answer
44 changes: 44 additions & 0 deletions syheo/programmers/디스크 컨트롤러.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
#프로그래머스
#고득점 Kit
#힙
#level3
#디스크 컨트롤러

# 아이디어
# request_time 오름차순 heapq인 jobs와 running_time 오름차순 heapq인 q를 생성
# 수행할 수 있는 프로세스 중 runnin_time이 빠른 프로세스를 수행-> 기다리는 시간 최소화
# 수행할 수 있는 프로세스가 없으면 request_time이 가장 작은 프로세스들을 큐에 push

import heapq

def solution(jobs):
answer = 0
cur_time = 0
length = len(jobs)
heapq.heapify(jobs)
q = []
while jobs or q:
# 현재 진행할 수 있는 프로세스 큐에 담음.
while jobs and jobs[0][0]<=cur_time:
request_time, running_time = heapq.heappop(jobs)
heapq.heappush(q,(running_time,request_time))
# 현재 진행할 수 있는 프로세스가 있는 경우
if q:
running_time, request_time =heapq.heappop(q)
if cur_time>request_time:
answer+=(cur_time-request_time)+running_time
cur_time += running_time
# cur_time <= request_time
else:
answer+=running_time
cur_time = request_time+running_time
# 현재 진행할 수 있는 프로세스가 없는 경우
else:
request_time, running_time =heapq.heappop(jobs)
heapq.heappush(q,(running_time,request_time))
cur_request_time = request_time
# 요청시간이 같은 경우가 2개 이상일 때 추가적으로 뽑음
while jobs and jobs[0][0]==cur_request_time:
request_time, running_time =heapq.heappop(jobs)
heapq.heappush(q,(running_time,request_time))
return answer//length
40 changes: 40 additions & 0 deletions syheo/programmers/소수 찾기.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#프로그래머스
#고득점 Kit
#완전 탐색
#level2
#소수 찾기

import sys
import math
sys.setrecursionlimit(10**9)
answer = set()

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 dfs(numbers,visited,string,length):
global answer
for i in range(length):
if not visited[i]:
#방문 처리
visited[i]=True
#소수 검사
if isPrime(int(string+numbers[i])):
#정답 추가
answer.add(int(string+numbers[i]))
dfs(numbers,visited,string+numbers[i],length)
#방문 undo
visited[i]=False

def solution(numbers):
numbers = list(numbers)
length = len(numbers)
visited = [False for _ in range(length)]
dfs(numbers,visited,'',length)
return len(answer)

32 changes: 32 additions & 0 deletions syheo/programmers/순위.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#프로그래머스
#고득점 Kit
#그래프
#level3
#순위

# 이긴 횟수 + 진 횟수 = n-1 -> 결과 알 수 있음.

def solution(n, results):
answer = 0
players = [[] for _ in range(n+1)]
victories = [set() for _ in range(n+1)]
loses = [set() for _ in range(n+1)]

for result in results:
victories[result[0]].add(result[1])
loses[result[1]].add(result[0])

for i in range(1,n+1):
#i한테 진애들은 i를 이긴 애들한테도 짐
for loser in victories[i]:
loses[loser].update(loses[i])
#i를 이긴애들은 i한테 진애들도 이김
for winner in loses[i]:
victories[winner].update(victories[i])

for i in range(1,n+1):
if len(victories[i]) + len(loses[i]) == n-1:
answer+=1


return answer
18 changes: 18 additions & 0 deletions syheo/programmers/전화번호 목록.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#프로그래머스
#고득점 Kit
#해시
#level2
#전화번호 목록

#아이디어
#phone_book을 set형으로 하나 저장하고
#모든 전화번호의 0~len(전화번호) 문자열이 phone_book_set에 있는지 탐색

def solution(phone_book):
answer = True
phone_book_set = set(phone_book)
for i in range(len(phone_book)):
for j in range(1,len(phone_book[i])):
if phone_book[i][:j] in phone_book_set:
return False
return answer
20 changes: 20 additions & 0 deletions syheo/programmers/정수 삼각형.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#프로그래머스
#고득점 Kit
#동적 계획법
#level3
#정수 삼각형

def solution(triangle):
answer = 0
length = len(triangle)
dp = [[0]*i for i in range(1,length+1)]
# 꼭대기 값 넣어줌
dp[0][0]=triangle[0][0]
#마지막-1줄까지 갈 수 있는 경로에 dp값을 갱신시킴
for i in range(length-1):
for j in range(i+1):
dp[i+1][j]=max(triangle[i+1][j]+dp[i][j],dp[i+1][j])
dp[i+1][j+1]=max(triangle[i+1][j+1]+dp[i][j],dp[i+1][j+1])

answer = max(dp[length-1])
return answer
49 changes: 49 additions & 0 deletions syheo/programmers/프린터.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
#프로그래머스
#고득점 Kit
#스택/큐
#level2
#프린터

# 아이디어
# 기존의 우선순위 리스트를 index와 값을 튜플로 가진 리스트로 변환하고 데크 자료형으로 변환시킴
# 그 후 우선순위를 비교하여 프린트함.
# iterable 객체에서 true 값이 하나라도 있으면 true를 반환해주는 any 메서드로 check_max_priority를 대체 할 수 있음

from collections import deque

def check_max_priority(priorities,prior,index):
for p,i in priorities:
if p>prior:
priorities.append((prior,index))
return False
return True


def solution(priorities, location):
answer = 0

priorities = deque([(priorities[i],i) for i in range(len(priorities))])

while True:
prior, index = priorities.popleft()
if check_max_priority(priorities,prior,index):
answer+=1
if index == location:
return answer

# any 메서드 사용
def solution2(priorities, location):
answer = 0

priorities = deque([(priorities[i],i) for i in range(len(priorities))])

while True:
prior, index = priorities.popleft()
if any([prior<priorities[i][0] for i in range(len(priorities))]):
priorities.append((prior,index))
else:
answer+=1
if index == location:
return answer