Problem Solving/Programmers (14)

문제링크

https://school.programmers.co.kr/learn/courses/30/lessons/42586?language=python3 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이

def solution(progresses, speeds):
    answer = []
    t, cnt = 0, 0
    while len(progresses) > 0:
        if progresses[0] + t*speeds[0] >= 100:
            progresses.pop(0)
            speeds.pop(0)
            cnt += 1
        else:
            if cnt > 0:
                answer.append(cnt)
                cnt = 0
            t += 1
    answer.append(cnt)
    return answer

100이 넘을때까지 전체 작업 진도를 진행시키고 작업진도>=100 이 됐을 때 맨 앞의 요소를 pop 하고 count를 증가시킨다.

작업 진도가 100이 넘지 않을때에는 count의 값이 0을 넘는지 확인하고 넘는다면 하루의 배포가 진행됐다는 것이니 answer에 추가해주고 count는 0으로 초기화한다. t는 개발 진행중인 일정로 치기 때문에 100을 넘기지 못하면 하루 증가.

리스트가 모두 비워졌을 때 남은 배포도 추가하기 위해 answer에 남은 카운트 값을 삽입한다.

문제링크

https://programmers.co.kr/learn/courses/30/lessons/42747

 

코딩테스트 연습 - H-Index

H-Index는 과학자의 생산성과 영향력을 나타내는 지표입니다. 어느 과학자의 H-Index를 나타내는 값인 h를 구하려고 합니다. 위키백과1에 따르면, H-Index는 다음과 같이 구합니다. 어떤 과학자가 발표

programmers.co.kr

풀이

def solution(citations):
    answer = 0
    n = len(citations)
    citations.sort(reverse=True)
    for i in range(n):
        h = i
        if citations[i] <= h:
            answer = h
            break
        elif citations[i] > h:
            answer = n
    return answer

아직 잘 이해를 하지 못했다. 반복문을 풀어쓰면 이렇게 된다.

i = 0, 6 <= 0 -> x
i = 1, 5 <= 1 -> x
i = 2, 3 <= 2 -> x
i = 3, 1 <= 3 ->  x

인덱스가 인용된 편수를 말하기 때문에 3번 이상 인용된 논문의 편수가 3개 이상인 걸로 결과가 나온다.

문제에 첨부된 링크에서 H-Index에 관한 설명은 내림차순 정렬 후, h-index (f) = max{i∈N : f(i) ≥ i} 라는데 반대로 푼 것 같다

문제 링크

https://programmers.co.kr/learn/courses/30/lessons/42746

 

코딩테스트 연습 - 가장 큰 수

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰

programmers.co.kr

 

풀이

def solution(numbers):
    answer = ''
    numbers = sorted(list(map(str, numbers)), key=lambda x : x*3, reverse=True)
    answer = "".join(numbers)
    return str(int(answer))

처음에는 람다를 사용해서 key=lambda x : x[0] 으로 풀었는데 이렇게 하면 결과가 [9, 5, 3, 30, 34]가 된다. 34, 3, 30 순으로 정렬이 되어야 한다. 입력이 1,000 이하이기 때문에 한자리수를 세자리까지 늘리기 위해 x*3을 한다. 그러면 343434, 333, 303030이 되어 인덱스 비교를 편하게 할 수 있다.

도저히 모르겠어서 다른 풀이를 봤는데 x*3이 뭔지도 모르겠어서 한참을 고민했다.

리스트를 문자열로 바꿨기 때문에 x*3은 리스트의 요소에 *3을 하는 것이 아닌 문자열을 3번 이어붙이는 것이었다.

문제 링크

https://programmers.co.kr/learn/courses/30/lessons/42748

 

코딩테스트 연습 - K번째수

[1, 5, 2, 6, 3, 7, 4] [[2, 5, 3], [4, 4, 1], [1, 7, 3]] [5, 6, 3]

programmers.co.kr

 

풀이

def solution(array, commands):
    temp = []
    leng = len(commands)
    answer = []
    for x in range(leng):
        i, j, k = commands[x][0], commands[x][1], commands[x][2]
        temp = array[i-1:j]
        temp.sort()
        answer.append(temp[k-1])
    return answer

인덱스 확인에 유의하자.

1 2