몸이 안 좋은 시기라서..^^;
효율이 왕창 떨어졌네요.
부끄럽습니다.
이번주 내로 Lv.1 마무리 하겠습니다.
if문이 없으니 처음에는 약 70점만 나왔다...
관련 조건: 스테이지에 도달한 유저가 없는 경우 해당 스테이지의 실패율은 0 으로 정의한다.
def solution(N, stages):
answer = {}
deno = len(stages)
for i in range(1,N+1):
nume = stages.count(i)
if nume == 0:
answer[i] = 0
else:
answer[i] = (nume/deno) #실패율
deno = deno - nume
lst = sorted(answer.items(), key=lambda x: x[1], reverse=True)
return [item[0] for item in lst]
매번 count 하지 않고 초반에 사전으로 미리 각 스테이지별 인원을 집계해두면 정렬을 제외 했을 때 O(n)의 시간복잡도로 풀 수 있습니다.
밑 코드가 훨씬 시간이 짧게 걸린다고 한다.
효율성이 너무 어렵다...ㅠㅠ
def solution(N, stages):
answer = []
fail = []
info = [0] * (N + 2)
for stage in stages:
info[stage] += 1
for i in range(N):
be = sum(info[(i + 1):])
yet = info[i + 1]
if be == 0:
fail.append((str(i + 1), 0))
else:
fail.append((str(i + 1), yet / be))
for item in sorted(fail, key=lambda x: x[1], reverse=True):
answer.append(int(item[0]))
return answer
틀린 코드
채점 전 테케조차 다 통과못했다...일부 조건을 놓치고 있나봄..
어렵다...ㅠㅠ
def solution(dartResult):
stack = []
sdt = ['S','D','T']
dartResult = dartResult.replace("10","A")
for item in dartResult:
if item.isnumeric(): #숫자저장
stack.append(int(item))
elif item == 'A': #10저장
stack.append(10)
elif item in sdt: #문자 제곱처리
stack.append(stack.pop()**(sdt.index(item)+1))
elif item == "*":
stack.append(stack.pop()*2)
elif item == "#":
stack.append(stack.pop()*(-1))
return sum(stack)
스타상()은 첫 번째 기회에서도 나올 수 있다. 이 경우 첫 번째 스타상()의 점수만 2배가 된다. (예제 4번 참고)
스타상()의 효과는 다른 스타상()의 효과와 중첩될 수 있다. 이 경우 중첩된 스타상(*) 점수는 4배가 된다. (예제 4번 참고)
스타상(*)의 효과는 아차상(#)의 효과와 중첩될 수 있다. 이 경우 중첩된 아차상(#)의 점수는 -2배가 된다. (예제 5번 참고)
이 조건을 놓치고 있는데 사실...잘 모르겠음^^;
첫번째 기회라는게 무조건 첫번째 점수일때인가?싶다.
국어해석이 안되니 원...;;
하 드디어...근데 이케 더럽게 푸는게 맞나? ㅠㅠ
def solution(dartResult):
stack = []
answer = []
sdt = ['S','D','T']
dartResult = dartResult.replace("10","A")
for item in dartResult:
if item.isnumeric(): #숫자저장
stack.append(int(item))
elif item == 'A': #10저장
stack.append(10)
elif item in sdt: #문자 제곱처리
answer.append(stack.pop()**(sdt.index(item)+1))
elif item == "*":
if len(answer) > 1:
answer[-2] *= 2
answer[-1] *= 2
else:
answer[-1] *= 2
elif item == "#":
answer[-1] *= -1
return sum(answer)
정규 표현식을 사용한 코드
import re
def solution(dartResult):
bonus = {'S' : 1, 'D' : 2, 'T' : 3}
option = {'' : 1, '*' : 2, '#' : -1}
p = re.compile('(\d+)([SDT])([*#]?)')
dart = p.findall(dartResult)
for i in range(len(dart)):
if dart[i][2] == '*' and i > 0:
dart[i-1] *= 2
dart[i] = int(dart[i][0]) ** bonus[dart[i][1]] * option[dart[i][2]]
answer = sum(dart)
return answer
리스트 컴프리헨션
def solution(k, m, score):
answer = []
score.sort(reverse=True) #계산 편하려고 정렬
result = [score[i*m:(i+1)*m] for i in range((len(score)+ m-1)//m)] # m개씩 묶기
answer = [min(item)*m for item in result if len(item)==m] #계산
return sum(answer)
덧셈 반복문
def solution(k, m, score):
answer = []
score.sort(reverse=True) #계산 편하려고 정렬
result = [score[i*m:(i+1)*m] for i in range((len(score)+ m-1)//m)] # m개씩 묶기
# m개 묶음이 된 리스트만 수식으로 계산
for item in result:
if len(item) == m:
answer += min(item)*m
return answer
숏코딩... 나는 왜 그런 헛된 시간을....
def solution(k, m, score):
return sum(sorted(score)[len(score)%m::m])*m
단순하게...내림차순해서 -1번째 값을 계속 뽑아내기
def solution(k, score):
answer = []
rank = []
for i in score:
rank.append(i)
rank.sort(reverse=True)
if len(rank)>k:
del rank[-1]
answer.append(rank[-1])
return answer
def solution(lottos, win_nums):
prize_lst = [6,6,5,4,3,2,1] #idx: 맞은 개수, value: 등수
lst = [item for item in lottos if item != 0] #0을 다 제거
cnt_0 = 6 - len(lst) #0의 개수
cnt_min = 0
for item in lst:
if item in win_nums:
cnt_min += 1 #최저 등수
return [prize_lst[cnt_0 + cnt_min],prize_lst[cnt_min]]
count 메서드 이용
def solution(lottos, win_nums):
rank=[6,6,5,4,3,2,1]
cnt_0 = lottos.count(0)
ans = 0
for x in win_nums:
if x in lottos:
ans += 1
return rank[cnt_0 + ans],rank[ans]
def solution(n, lost, reserve):
reserve_1 = set(reserve) - set(lost) #확실히 여분이 있는 학생
lost_1 = set(lost) - set(reserve) #lost랑 reserve에서 중복되는 학생 제거
reserve_2 = sorted(list(reserve_1), reverse = True) #정렬
lost_2 = sorted(list(lost_1), reverse = True)
for i in reserve_2:
if i+1 in lost_2:
lost_2.remove(i+1)
elif i-1 in lost_2:
lost_2.remove(i-1)
return n - len(lost_2)
import collections
def solution(participant, completion):
#participant-completion=answer 완주하지 못한 선수
answer = collections.Counter(participant)-collections.Counter(completion)
answer = list(answer.keys())[0]
return answer
count쓰면 터진다고 한다...
그래서 Counter 모듈을 써야한다...
시간복잡도란...ㅠㅠ
from collections import Counter
#각 원소가 몇번씩 나오는지 세고, 교집합하고
#교집합의 elements로 카운터 숫자만큼 요소 반환
#리스트로 만들고 정렬
def solution(X,Y):
result = sorted(list((Counter((int(i) for i in X))&Counter((int(i) for i in Y))).elements()), reverse=True)
if len(result) == 0:
return '-1'
if result[0] == 0:
return '0'
return ''.join((str(i) for i in result))
제곱근만큼 반복문으로 약수 구하기
제곱근이면 1개만 카운트 (5*5=25 같은 경우...)
아니면 2개 카운트
약수 개수가 limit 넘어가면 그냥 power 반환
def cnt_division(n,limit,power):
cnt = 0
for i in range(1, int(n**(1/2))+1):
if n%i == 0:
if i == n//i:
cnt += 1
else:
cnt += 2
if cnt > limit:
return power
return cnt
def solution(number, limit, power):
answer = 1 #1의 약수의 개수는 1, 하나라서 여기서 시작
for i in range(2, number+1):
answer += cnt_division(i, limit, power)
return answer