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로 바꿔줬다. 

728x90

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

출처 : 프로그래머스

 

코딩테스트 연습 - 124 나라의 숫자

 

programmers.co.kr


def solution(n):
    answer = ''
    while n:
        if n%3 != 0:
            answer += str(n%3)
            n //= 3
        else: # 3의 배수면 일의 자리는 4
            answer += '4'
            n = n//3 -1
            print(n)

    return answer[::-1]

풀이

3진법으로 변환하는 문제랑 똑같이 생각하면 된다.

하지만, 3으로 나눠떨어질 때만 일의 자리수가 4로 된다..

또한, 나눠지니까 -1을 해줘야한다.

728x90

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

출처 : 프로그래머스

 

 

코딩테스트 연습 - 행렬의 곱셈

[[2, 3, 2], [4, 2, 4], [3, 1, 4]] [[5, 4, 3], [2, 4, 1], [3, 1, 1]] [[22, 22, 11], [36, 28, 18], [29, 20, 14]]

programmers.co.kr


def solution(arr1, arr2):
    answer = [[0 for _ in range(len(arr2[0]))] for _ in range(len(arr1))]

    for i in range(len(arr1)): # 0, 1, 2
        for j in range(len(arr2[0])): # 0, 1
            for k in range(len(arr1[0])): # 0, 1
                answer[i][j] += arr1[i][k] * arr2[k][j]
    return answer

풀이 1

for 문을 3번 써서 풀이했다. 

 

def solution(arr1, arr2):
    return [[sum(a*b for a,b in zip(ROW,COL)) for COL in zip(*arr2)] for ROW in arr1 ]

풀이 2

zip 을 활용해 풀이하는 방법이다.

 

numpy 에서 np.array 로 바꿔서 a*b 해도 된다.

+ Recent posts