728x90

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

 

코딩테스트 연습 - [1차] 뉴스 클러스터링

뉴스 클러스터링 여러 언론사에서 쏟아지는 뉴스, 특히 속보성 뉴스를 보면 비슷비슷한 제목의 기사가 많아 정작 필요한 기사를 찾기가 어렵다. Daum 뉴스의 개발 업무를 맡게 된 신입사원 튜브

programmers.co.kr

출처 : 프로그래머스


from collections import Counter
import math
def solution(str1, str2):
    answer = 0
    # 모두 대문자로 통일
    str1 = str1.upper()
    str2 = str2.upper()
    print(str1,str2)
    
    # 문자열로만 구성된 2글자 배열에 삽입
    tmp1 = []
    tmp2 = []
    for s1 in range(len(str1)-1):
        if str1[s1].isalpha() and str1[s1+1].isalpha():
            tmp1.append(str1[s1]+str1[s1+1])
    for s2 in range(len(str2)-1):
        if str2[s2].isalpha() and str2[s2+1].isalpha():
            tmp2.append(str2[s2]+str2[s2+1])

    # Counter 객체
    counter1 = Counter(tmp1)
    counter2 = Counter(tmp2)
    
    # 교집합과 합집합
    interset_set = list((counter1 & counter2).elements())
    union_set = list((counter1 | counter2).elements())
    
    if len(union_set) == 0:
        return 65536
    
    return math.floor((len(interset_set) /len(union_set))*65536)

풀이

대소문자 구분을 하지 않으니 모두 대문자로 통일시켜서 시작했다.

또한, 2개씩 문자열을 나눠서 배열에 넣을 때, 쪼갠 2개가 문자열이 맞는지 isalpha()로 확인해서 배열에 넣었다.

그리고 Counter() 를 사용해 객체를 만들어냈다.

Counter()는 set()처럼 교집합 & , 합집합 | 을 만들수 있다.

Counter().elements() 를 사용하면 요소(값) 만 뽑을 수 있다.

728x90

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

 

코딩테스트 연습 - 주식가격

초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요. 제한사항 prices의 각 가격은 1 이상 10,00

programmers.co.kr

출처 : 프로그래머스


def solution(prices):
    answer = []
    for i in range(len(prices)):
        cnt = 0
        for j in range(i+1,len(prices)):
            if prices[i] <= prices[j]:
                cnt += 1
            else:
                cnt += 1
                break
        answer.append(cnt)
        cnt = 0
    return answer

풀이 1 

이중포문을 사용해서 효율성은 떨어진다.

문제 카테고리에 맞게 스택/큐를 사용해봐야겠다.

 

from collections import deque

def solution(prices):
    answer = []
    prices = deque(prices)
    while prices:
        p = prices.popleft()
        cnt = 0
        for pq in prices:
            if p > pq:
                cnt += 1
                break
            cnt += 1
        answer.append(cnt)
    return answer

풀이 2

큐를 이용해 풀이했다.

prices 배열을 큐로 변환해서 풀이한거 말고는 이중반복문이랑 비슷하다.

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

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

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

+ Recent posts