728x90

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

 

코딩테스트 연습 - 큰 수 만들기

 

programmers.co.kr

출처 : 프로그래머스


def solution(number, k):
    stack = []
    for num in number:
        # 다음 넣을 num이 스택에 마지막 수보다 크면 스택에 있는걸 뺀다.
        while stack and stack[-1] < num and k>0: 
            k-=1
            stack.pop()
        stack.append(num) # num 넣는다.
    if k>0:
        stack = stack[:-k]
    return ''.join(stack)

풀이

stack을 사용했다.

number의 수를 차례대로 stack에 넣는다.

이때, stack에 꼭대기에 있는 값과 다음에 넣을 num 값을 비교한다.

스택에 넣을 num 값이 더 크다면 stack에 있는 값을 빼고 k를 하나 줄인다. 

 

이때, 12번 테스트 케이스가 오류 난다.

생각해봤는데 while 문을 다 돌았을 때도 k가 양수인 경우가 있다.

"7654321"처럼 내림차순으로 정렬되어 있는 경우 다 돌아도 k가 양수이다.

이 때는 끝에 있는 k개 문자만 제거하면 된다.

728x90

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

출처 : 프로그래머스

 

코딩테스트 연습 - N개의 최소공배수

두 수의 최소공배수(Least Common Multiple)란 입력된 두 수의 배수 중 공통이 되는 가장 작은 숫자를 의미합니다. 예를 들어 2와 7의 최소공배수는 14가 됩니다. 정의를 확장해서, n개의 수의 최소공배

programmers.co.kr


import math as m
def solution(arr):
    answer = 0
    for i in range(len(arr)-1):
        answer = (arr[i] * arr[i+1]) // m.gcd(arr[i], arr[i+1])
        arr[i+1] = answer

    return answer
import math as m
def solution(arr):
    answer = arr[0]
    for i in arr:
        answer = i * answer // m.gcd(i, answer)
    return answer

풀이

두 수의 최소공배수는 두 수의 곱 나누기 두 수의 최대공약수인 알고리즘 ( 유클리드 호제법)을 사용해서 풀이한다.

728x90

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

출처 : 프로그래머스

 

코딩테스트 연습 - 다리를 지나는 트럭

트럭 여러 대가 강을 가로지르는 일차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 다리에는 트럭이 최대 bridge_length대 올라갈

programmers.co.kr


def solution(bridge_length, weight, truck_weights):
    answer = 0
    bridge = [0] * bridge_length
    while bridge:
        bridge.pop(0) # 맨 첫 원소 pop
        answer += 1
        if truck_weights:
            if sum(bridge) + truck_weights[0] <= weight:
                bridge.append(truck_weights.pop(0))
            else:
                bridge.append(0)
    return answer

풀이

문제 설명이 부족해서 문제 이해하는데 오래걸렸다.

1초에 1길이만큼 이동한다.

 

다리 길이와 버틸 수 있는 무게를 생각해서 list 로 풀었다.

pop(0) 와 sum()을 써서 효율은 떨어진다.

 

 

728x90

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

 

코딩테스트 연습 - 괄호 변환

카카오에 신입 개발자로 입사한 "콘"은 선배 개발자로부터 개발역량 강화를 위해 다른 개발자가 작성한 소스 코드를 분석하여 문제점을 발견하고 수정하라는 업무 과제를 받았습니다. 소스를

programmers.co.kr

출처 : 프로그래머스


# 데브매칭
# w를 두 "균형잡힌 괄호 문자열" u, v 로 분리하는 함수
def divided(w):
    w_sum = 0
    for i in range(len(w)):
        if w[i] == '(':
            w_sum += 1
        elif w[i] == ')':
            w_sum -= 1
        if w_sum == 0:  # 균형잡힌 괄호 문자열
            return w[:i + 1], w[i+1:]


# "올바른 괄호 문자열" 체크 함수
def check(arr):
    stack = []
    for i in arr:
        if i == "(":
            stack.append(i)  # 스택 삽입
        elif i == ")":  # 스택 pop( 짝 맞추기 비교)
            if not stack:  # 스택 비어있으면 안맞는거임
                return False
            stack.pop()
    return True


def solution(p):
    if p == "":
        return p
    u, v = divided(p)
    # print(u,v)
    
    if check(u):  # 올바른 괄호 문자열이라면
        return u + solution(v)

    else:  # 올바른 괄호 문자열이 아니라면
        answer = "("
        answer += solution(v)
        answer += ")"

        # tmp = u[1:len(u)-1]
        # answer += tmp[::-1]
        for i in range(1,len(u)-1):
            if u[i] == "(":
                answer += ")"
            else:
                answer += "("
        
        return answer

풀이

문제가 길어서 빡구현하는데 헷갈렸다.

  4-4. u의 첫 번째와 마지막 문자를 제거하고, 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙입니다. 

이 규칙에서 뒤집는거를 문자열을 아예 뒤집는 것으로 잘못 이해해서 계속 오류가 났다.

괄호 방향을 뒤집는 것이었다^^...

문제가 길수록 빨리 이해하고 빠르게 구현하는 법을 익히자.

 

 

"올바른 괄호"를 구별하는 함수를 stack으로 구현했다.

개수가 아닌 짝을 맞춰야 하니까 

"("  가 들어오면 stack에 넣고 " )"가 들어오면 빼서 짝수가 맞는지 확인한다.

이때, stack이 비어있으면, 다시 말해서 pop을 더 이상 할 수 없으면 False 다

짝이 맞지 않는 것이다.

728x90

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

 

코딩테스트 연습 - 숫자의 표현

Finn은 요즘 수학공부에 빠져 있습니다. 수학 공부를 하던 Finn은 자연수 n을 연속한 자연수들로 표현 하는 방법이 여러개라는 사실을 알게 되었습니다. 예를들어 15는 다음과 같이 4가지로 표현 할

programmers.co.kr

출처 : 프로그래머스


def solution(n):
    answer = 0
    for i in range(1,n+1):
        tmp = 0
        for j in range(i,n+1):
            tmp += j
            if tmp == n:
                answer += 1
                break
            elif tmp > n:
                break
    return answer

풀이 1

1부터 n까지 반복문을 돌면서

이중반복문으로 sum을 구했다.

 

def solution(n):
    return len([i for i in range(1,n+1,2) if n%i==0])

풀이 2

자기보다 작은 홀수의 개수가 정답이 된다....

이건 다른 사람 코드를 참고했다..ㅠㅠㅠㅠㅠ

728x90

https://programmers.co.kr/learn/courses/30/lessons/42587#

 

코딩테스트 연습 - 프린터

일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린

programmers.co.kr

출처 : 프로그래머스


from collections import deque
def solution(priorities, location):
    answer = 0
    q = deque([v,i] for i,v in enumerate(priorities))
    print(q)
    while q:
        tmp = q.popleft()
        # q가 남아 있어야 max 값이 있음.
        if q and tmp[0] < max(q)[0]: # 중요도가 높은 문서가 있다면
            q.append(tmp)
        else:
            # 문서 인쇄
            answer += 1
            if tmp[1] == location: # 인쇄한 문서의 초기 인덱스가 요청한 문서면 끝
                break
    return answer

풀이

문서의 인덱스와 우선순위(값)를 같이 관리해줘야 하기 때문에 enumerate을 사용해서 풀이하면 유용하다.

또한, 처음 원소를 빼고 마지막에 더하고 이러한 연산을 반복하니 deque 를 사용했다.

처음 문서를 빼서 이 문서의 우선순위보다 큰 값이 큐에 있으면 맨 뒤에 제거하는 것은

큐의 max 값과 비교했다. 

이 떄, 큐에서 처음 문서를 뺐을 때, 큐가 비면 max 값 작동이 되지 않는다.

주의하자~~~~~~~~~

 

인쇄한 문서의 인덱스가 요청한 문서의 인덱스와 같다면 break를 통해 while 문을 빠져나온다.

728x90

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

출처 : 프로그래머스

 

코딩테스트 연습 - 다음 큰 숫자

자연수 n이 주어졌을 때, n의 다음 큰 숫자는 다음과 같이 정의 합니다. 조건 1. n의 다음 큰 숫자는 n보다 큰 자연수 입니다. 조건 2. n의 다음 큰 숫자와 n은 2진수로 변환했을 때 1의 갯수가 같습니

programmers.co.kr


def solution(n):
    answer = 0
    print(bin(n))
    cnt = bin(n).count('1')
    
    for i in range(n+1,1000001):
        if bin(i).count('1') == cnt:
            answer = i
            break
    return answer

풀이

bin() 함수로 10진수를 2로 바꿔줬다. 

+ Recent posts