https://programmers.co.kr/learn/courses/30/lessons/42746
def solution(numbers):
answer = ''
numbers.sort()
dic = {i:[] for i in range(0, 10)}
for i in range(len(numbers)):
s = int(str(numbers[i])[0])
if str(numbers[i])[-1] == "0":
dic[s].insert(0, numbers[i])
else:
dic[s].append(numbers[i])
for i in range(9, -1, -1):
while dic[i]:
answer += str(dic[i].pop())
return answer
처음엔 재귀로 모든 조합들을 찾아서 max 값을 return 하려 했지만 타임리밋,,
그래서 큰 숫자들부터 앞자리에 배치하기로 했다.
우선 numbers
정렬 => sort()
dic
만들어서 0 ~ 9
의 숫자들 넣어줌
numbers
를 보면서 시작 값 s
에 해당하는 dic[s]
에 값 넣어주기
이 때, 0 으로 끝나는 숫자들은 insert 로 맨 앞에 넣어줌
ex) [3, 30, 34, 5, 9]
=> dic[3] = [30, 3, 34]
, dic[5] = [5]
, dic[9] = [9]
큰 숫자들부터 answer
에 붙여주고 return
그러나... 안됨!!
0 만 고려할게 아닌듯...
def solution(numbers):
numbers = list(map(str, numbers))
numbers.sort(key=lambda x: x*3, reverse=True)
return str(int(''.join(numbers)))
numbers
의 숫자들을 string 으로 변경
=> list(map(str, numbers))
알아두자!!
정렬은 "numbers
값 * 3" 기준 & 역순으로!!
3 을 곱해주는 이유는 1,000 이하의 숫자들이기 때문에 세자리로 맞추기 위해서
ex) [3, 30, 34, 5, 9]
=> "9534330"
int 형일 때, 그냥 sort() => [34, 30, 9, 5, 3]
(❌)
str 형일 때, 그냥 sort() => [9, 5, 34, 30, 3]
(❌)
str 형일 때, 3 곱한 값으로 sort() => [999, 555, 343434, 333, 303030]
=> [9, 5, 34, 3, 30]
(⭕)
000
처럼 모든 숫자가 0
인 경우도 있으므로 int 로 변환했다가 다시 string 으로 변환
https://programmers.co.kr/learn/courses/30/lessons/42747
def solution(citations):
answer = 0
citations.sort()
idx = 0
for i in range(1, max(citations)):
while idx < len(citations) and citations[idx] < i:
idx += 1
if idx <= i and len(citations) - idx >= i:
answer = max(answer, i)
return answer
우선 citations
정렬 => sort()
1 ~ max(citations)
의 범위에서 H-index 찾기
citations
에서의 i
위치를 idx
로 찾아서
"h 번 이상 인용된 논문이 h 편 이상 & 나머지 논문이 h 번 이하" 인지 확인
def solution(citations):
citations.sort()
l = len(citations)
for i in range(l):
if citations[i] >= l-i:
return l-i
return 0
더 간단한 천재같은 풀이
정렬 후, "0 ~ citations
의 길이" 의 범위만 확인
if citations[i] >= l-i:
=> citations[i]
: h
=> l-i
: h 번 이상 인용된 논문의 개수
ex) [0, 1, 3, 5, 6]
=> 0 >= 5
, 1 >= 4
, 3 >= 3
=> return 3
ex) [0, 1, 5, 6]
=> 0 >= 5
, 1 >= 4
, 5 >= 2
=> return 2
훨씬 빠르다
https://programmers.co.kr/learn/courses/30/lessons/42839
combinations = set()
def solution(numbers):
global combinations
def comb(nums, c):
if c and int(c) > 1:
combinations.add(int(c))
if len(nums) == 0:
return
for i in range(len(nums)):
comb(nums[:i] + nums[i+1:], c+nums[i])
comb(numbers, "")
answer = 0
for c in combinations:
isPrime = 1
for i in range(2, int(c**0.5)+1):
if c % i == 0:
isPrime = 0
break
if isPrime:
answer += 1
return answer
종이 조각으로 만들 수 있는 모든 숫자의 경우를 combinations
에 저장
=> 재귀 함수 comb 를 이용
구한 숫자들은 소수인지 판단하기 위해 2 ~ 루트 c
까지 약수가 있는지 확인
소수들의 개수만 세줘서 return
from itertools import permutations
def solution(n):
a = set()
for i in range(len(n)):
a |= set(map(int, map("".join, permutations(list(n), i + 1))))
a -= set(range(0, 2))
for i in range(2, int(max(a) ** 0.5) + 1):
a -= set(range(i * 2, max(a) + 1, i))
return len(a)
정말 천재같은 코드...
1) 숫자들의 조합 구하기
a |= set(map(int, map("".join, permutations(list(n), i + 1))))
permutations(list(n), i + 1))
=> 리스트 n
을 이용한 i+1
길이의 조합a
에 저장|=
=> 중복 제거2) a
에서 0 ~ 1
값은 제거
(=> set 를 -
연산을 이용해서 제거 가능하다는 걸 첨 알았다,,)
3) 소수 찾기
범위: 2 ~ 루트 (최댓값)
a -= set(range(i * 2, max(a) + 1, i))
i
의 배수들은 a
에서 모두 제거에라토스테네스 체
:2 ~ 루트 n
까지의 숫자들을 보면서 각 숫자들의 배수들을 미리 없애주는 방식def prime_list(n): # 에라토스테네스의 체 초기화: n개 요소에 True 설정(소수로 간주) sieve = [True] * n # n의 최대 약수가 sqrt(n) 이하이므로 i=sqrt(n)까지 검사 m = int(n ** 0.5) for i in range(2, m + 1): if sieve[i] == True: # i가 소수인 경우 for j in range(i+i, n, i): # i이후 i의 배수들을 False 판정 sieve[j] = False # 소수 목록 산출 return [i for i in range(2, n) if sieve[i] == True]
시간 복잡도:
O(N**0.5)
https://programmers.co.kr/learn/courses/30/lessons/42842
def solution(brown, yellow):
answer = []
for i in range(yellow, 0, -1):
w = i
h = yellow // i + yellow % i
b = w * 2 + h * 2 + 4 + (w*h - yellow)
if b == brown:
if w > h:
return [w+2, h+2]
else:
return [h+2, w+2]
return answer
yellow
의 형태가 어떨지 모르기 때문에 (항상 정사각형의 모양이란 보장이 X)
yellow ~ 1
까지의 모든 범위 확인
가로 w
= i
세로 h
= yellow // i + yellow % i
yellow // i
: ㅁ 모양처럼 모든 줄이i
개만큼 꽉 참
yellow % i
: ㄱ 모양처럼 일부가 비어있는 경우를 합한 것이 세로가 됨
yellow 를 감싼 브라운의 개수 b
= w * 2 + h * 2 + 4 + (w*h - yellow)
w * 2 + h * 2
: 순수 yellow 를 감싼 브라운
4
: 4 개의 모서리
(w*h - yellow)
: ㄱ 모양처럼 비어있는 곳을 채워주는 브라운
if b == brown:
=> 더 큰 값을 가로로 잡아서 return
def solution(brown, yellow):
for i in range(1, int(yellow**(1/2))+1):
if yellow % i == 0:
if 2*(i + yellow//i) == brown-4:
return [yellow//i+2, i+2]
이 문제는 역시 공식이 있었다..^^
1 ~ 루트 yellow
까지의 숫자들 중에 yellow
의 약수
그 중에서도 if 2*(i + yellow//i) == brown-4:
를 만족하는 i
찾기
확실히 더 빠르다^^