Problem Solving (67)

문제링크

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

인덱스 확인에 유의하자.

문제 링크

https://app.codility.com/programmers/lessons/1-iterations/binary_gap/

 

BinaryGap coding task - Learn to Code - Codility

Find longest sequence of zeros in binary representation of an integer.

app.codility.com

 

풀이

def solution(N):
    bnum = format(N, 'b')
    cnt = 0
    temp = []
    m = 0
    for i in bnum:
        if i == '1' and len(temp) == 0:
            temp.append(i)
        elif i == '0' and temp[0] == '1':
            cnt += 1
        elif i == '1' and temp[0] == '1':
            temp.pop()
            temp.append(i)
            if m < cnt:
                m = cnt
            cnt = 0
    return m

format(N, 'b')은 숫자 N을 이진수로 포맷팅 한다. N = 9 이면 1001이 출력된다.

stack을 사용하여 반복문이 1을 만났을 때 이전까지 카운트한 0의 값을 저장하도록 코드를 구현했는데 풀고 나니 보완할 점이 보인다.

추후에 더 깔끔하게 작성해봐야겠다.

 

문제링크

 

풀이

T = int(input())
for test in range(1, T+1):
    print(f"#{test}")
    row = int(input())
    arr = [[0] * row for _ in range(row)]
    for i in range(row):
        for j in range(row):
            if j==0 or i==j:
                arr[i][j] = 1
            else:
                arr[i][j] = arr[i-1][j-1] + arr[i-1][j]
    for i in range(row):
        for j in range(i+1):
            print(arr[i][j], end=' ')
        print()

입력받은 크기만큼 정방향 2차원 배열을 생성한다.

i = 0, i == j는 1로 삽입된다. 그 외에는 왼쪽 위, 오른쪽 위의 요소를 합한 값을 삽입한다.

출력 시 i==j인 부분까지만 출력한다.

문제링크

 

풀이

T = int(input())
for i in range(1, T+1):
    cnt = str(i).count('3') + str(i).count('6') + str(i).count('9')
    if(cnt != 0):
        print('-'*cnt, end=' ')
    else:
        print(i, end=' ')

들어오는 숫자를 문자열로 받아서 3, 6, 9이면 카운트에 포함시키고 카운트 수 만큼 -를 출력한다.

 

문제링크

 

풀이

T = int(input())
for test in range(T):
    N = int(input())
    pl = list(map(int, input().split()))
    pro = 0
    sell = 0
    for i in pl[N-1::-1]:
        if(sell > i):
            pro = pro + sell - i
        else:
            sell = i
    print(f"#{test+1} {str(pro)}")

 

if / else

마지막 날에는 전부 팔아야 하기 때문에 리스트의 마지막부터 계산한다.

마지막을 판매가격으로 잡고 판매가격보다 작으면 수익을 계산한다.

판매가격보다 비싸면 판매가격을 변경한다.

1 ··· 4 5 6 7