코딩테스트 연습 Lv.1 마무리 1

김채원·2023년 2월 8일
0

coding_test

목록 보기
10/11

몸이 안 좋은 시기라서..^^;
효율이 왕창 떨어졌네요.
부끄럽습니다.
이번주 내로 Lv.1 마무리 하겠습니다.


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

[1차] 다트 게임

틀린 코드
채점 전 테케조차 다 통과못했다...일부 조건을 놓치고 있나봄..
어렵다...ㅠㅠ

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)

단순하게...내림차순해서 -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
profile
잡다한 공부 기록용

0개의 댓글