본문 바로가기
알고리즘 문제 풀이/Programmers

[2회차]

by 중앙백 2021. 12. 5.

Programmers Level.1 크레인 인형뽑기

def solution(board, moves):
    stack = []
    answer = 0
    for j in moves:
        for i in range(len(board)):
            if board[i][j-1] != 0:
                stack.append(board[i][j - 1])
                board[i][j - 1] = 0
                if len(stack)>=2 and stack[-1] == stack[-2]:
                    stack.pop()
                    stack.pop()
                    answer += 2
                break
    return answer

 

 

 

Programmers Level.1 없는 숫자 더하기

def solution(numbers):
    lists = [0,1,2,3,4,5,6,7,8,9]
    answer = 0
    for i in lists:
        if i not in numbers:
            answer += i
    return answer

 

 

 

Programmers Level.1 음양 더하기

def solution(absolutes, signs):
    answer = 0
    for i in range(len(absolutes)):
        if signs[i]:
            answer += absolutes[i]
        else:
            answer -= absolutes[i]
    return answer

다른 풀이 보고 zip을 활용해서 새롭게 적어본다.

def solution(absolutes, signs):
    answer = 0
    for absolute, sign in zip(absolutes, signs):
        if sign:
            answer += absolute
        else:
            answer -= absolute
    return answer

 

 

 

Programmers Level.1 내적

def solution(a, b):
    answer = 0
    for A, B in zip(a, b):
        answer += A*B
    return answer

 

 

 

Programmers Level.1 소수 만들기

def solution(nums):
    array = [x for x in range(2, 3000)]
    for i in range(2, 56):
        for j in range(2, 3000//i):
            if i*j in array:
                array.remove(i*j)
    answer = 0
    l = len(nums)
    for i in range(l-2):
        for j in range(i+1, l-1):
            for k in range(j+1, l):
                if nums[i]+nums[j]+nums[k] in array:
                    answer += 1
    return answer

에라토스테네스의 체 활용.

 

 

 

Programmers Level.1 완주하지 못한 선수

처음에는 부르트포스로 하나씩 일일이 둘을 비교했더니 효율성 문제가 생겼음. 그래서 정렬 후에 둘을 비교함.

def solution(participant, completion):
    participant.sort()
    completion.sort()
    for i in range(len(completion)):
        if participant[i] != completion[i]:
            return participant[i]
    return participant[-1]

다른 사람의 풀이를 확인하니까 zip을 활용해도 괜찮더라. participant와 completion의 크기가 다르기 때문에 안될줄 알았는데 되더라.

def solution(participant, completion):
    participant.sort()
    completion.sort()
    for i,j in zip(participant, completion):
        if i != j:
            return i
    return participant[-1]

collections 모듈의 counter를 활용하는 방법도 있더라.

import collections


def solution(participant, completion):
    answer = collections.Counter(participant) - collections.Counter(completion)
    return list(answer.keys())[0]

 

 

 

Programmers Level.1 K번째수

def solution(array, commands):
    answer = []
    for command in commands:
        new_array = array[command[0]-1:command[1]]
        new_array.sort()
        answer.append(new_array[command[2]-1])
    return answer

 

 

 

Programmers Level.1 모의고사

def solution(answers):
    answer = list()
    score = [0, 0, 0]
    A = [1,2,3,4,5]
    B = [2,1,2,3,2,4,2,5]
    C = [3,3,1,1,2,2,4,4,5,5]
    for i in range(len(answers)):
        if A[i % 5] == answers[i]:
            score[0] += 1
        if B[i % 8] == answers[i]:
            score[1] += 1
        if C[i % 10] == answers[i]:
            score[2] += 1
    maxi = max(score)
    for i in range(3):
        if score[i] == maxi:
            answer.append(i+1)
    return answer

*

 

 

Programmers Level.2 체육복

def solution(n, lost, reserve):
    array = [1] * (n + 1)
    lost.sort()
    reserve.sort()
    array[0] = 0
    for i in lost:
        array[i] = 0
    for i in reserve:
        if array[i] == 0:
            array[i] = 1
        elif i > 1 and array[i-1] == 0:
            array[i-1] = 1
        elif i < n and array[i+1] == 0:
            array[i+1] = 1
    return sum(array)

 - 틀림.  맞게 생각한 것 같은데 틀려서 곤란했다. 그래서 일단 혹시나 해서 아래와 같이 바꿔보니까 답은 맞았다. 둘의 차이가 뭐지?

 

def solution(n, lost, reserve):
    array = [1] * (n + 1)
    lost.sort()
    reserve.sort()
    array[0] = 0
    for i in lost:
        if i not in reserve:
            array[i] = 0
    for i in reserve:
        if i not in lost:
            if i > 1 and array[i-1] == 0:
                array[i-1] = 1
            elif i < n and array[i+1] == 0:
                array[i+1] = 1
    return sum(array)

 - 맞음.

 

 - (둘의 차이) n = 5, lost = [2, 3], reserve = [1, 2]일 때,

    위에 방식대로 하면 lost에 의해 처음 array에는 [1번,4번,5번]이고 reserve에서 1번이 2번에게 빌려주고, 2번이 3번에게 빌려준다. 그러면 5명이 전부 갖고 올 수 있다. 하지만 이건 문제의 조건에 맞지 않는다.

    아래 방식대로 해야 처음에 array = [1번,4번,5번]일 때, 문제 조건에서 여벌을 갖고 있는 사람이 체육복을 잃어버렸을 때는 누구에게 빌려주지 않고 자기 자신이 사용한다고 했으니까 2번이 2번에게 빌려주고 1번은 누구에게도 빌려주지 않게 되서 4명만 체육복을 갖고 있게 된다. 체육복 여벌이 있으면서 체육복을 잃어버린 사람들을 먼저 처리해줘야 한다는 뜻이다.

 

 

 

Programmers Level.1 폰켓몬

def solution(nums):
    answer = 0
    a = len(set(nums))
    n = len(nums)
    if a <= n//2:
        answer = a
    else:
        answer = n//2
    return answer

 

이걸 짧게 적기.

def solution(nums):
    return min(len(set(nums)),len(nums)/2)

 

 

 

Programmers Level.1 실패율

def solution(N, stages):
    player = [0] * (N + 1)
    answer = []
    dicts = {}
    for i in stages:
        player[i-1] += 1
    sums = sum(player)
    for j, i in enumerate(player[:-1]):
        if i == 0:
            dicts[j+1] = 0
        else:
            dicts[j+1] = i/sums
            sums -= i
    dict_sorted = sorted(dicts.items(),key=lambda a:a[1],reverse=True)
    for i in dict_sorted:
        answer.append(i[0])
    return answer

 - 내 풀이

 

def solution(N, stages):
    result = {}
    denominator = len(stages)
    for stage in range(1, N+1):
        if denominator != 0:
            count = stages.count(stage)
            result[stage] = count / denominator
            denominator -= count
        else:
            result[stage] = 0
    return sorted(result, key=lambda x : result[x], reverse=True)

 - 다른 사람의 풀이. 

 

 - 나는 items를 이용해 튜플 형태로 추출한 다음에 정렬하고 거기서 key값을 뽑아냈는데 굳이 그렇게 하지 않아도 되는 것 같다. 좋은 공부가 됐다.

 

 

 

Programmers Level.1 약수의 개수와 덧셈

def solution(left, right):
    answer = 0
    for i in range(left, right + 1):
        cnt = 1
        for j in range(1, i):
            if i % j == 0:
                cnt += 1
        if cnt % 2 == 0:
            answer += i
        else:
            answer -= i
    return answer

 

 

 

Programmers Level.1 3진법 뒤집기

def solution(n):
    answer = 0
    array = []
    a = n
    while a != 0:
        array.append(a % 3)
        a = a // 3
    for i in range(len(array)):
        answer += array[i] * 3 ** (len(array)-i-1)
    return answer

 - 3진법을 직접 계산하는 식으로 구현.

 

def solution(n):
    ss = ''
    a = n
    while a != 0:
        ss += str(a % 3)
        a = a // 3
    return int(ss,3)

 - int함수 기능으로 3진법을 구현할 수 있더라. 문자열과 int함수의 합작.

 

 

 

Programmers Level.1 예산

def solution(d, budget):
    answer = 0
    d.sort()
    for i in d:
        budget -= i
        if budget < 0:
            break
        answer += 1
    return answer

greedy알고리즘으로 가장 작은 무게 부터 하나씩 넣어서 해결.

 

 

 

Programmers Level.1 두 개 뽑아서 더하기

def solution(numbers):
    answer = []
    for i in range(len(numbers) - 1):
        for j in range(i + 1, len(numbers)):
            if numbers[i] + numbers[j] not in answer:
                answer.append(numbers[i] + numbers[j])
    answer.sort()
    return answer

 

 

 

Programmers Level.1 2016년

def solution(a, b):
    answer = ''
    day = 0
    days = [0,31,29,31,30,31,30,31,31,30,31,30]
    dayword = ['THU', 'FRI', 'SAT', 'SUN', 'MON', 'TUE', 'WED']
    for i in range(a):
        day += days[i]
    day += b
    return dayword[day % 7]

 

 

'알고리즘 문제 풀이 > Programmers' 카테고리의 다른 글

[6회차]  (0) 2021.12.09
[5회차]  (0) 2021.12.08
[4회차]  (0) 2021.12.07
[3회차]  (0) 2021.12.06
[1회차]  (0) 2021.12.04

댓글