728x90
반응형

문제 출처 : https://programmers.co.kr/learn/courses/30/lessons/42584

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

solution.c 1 #include <stdio.h> 2 #include <stdbool.h> 3 #include <stdlib.h> 4 ​ 5 // prices_len은 배열 prices의 길이입니다. 6 int* solution ( int prices [], size_t prices_len ) { 7 // return 값은 malloc 등 동적 할당을 사용해주세요. 할당 길이는 상황에 맞게 변경해주세요. 8 int* answer = ( int* ) malloc ( 1 ); 9 return answer ; 10 } 실행 결과 ...

programmers.co.kr

문제 설명

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

제한사항

prices의 각 가격은 1 이상 10,000 이하인 자연수입니다.

prices의 길이는 2 이상 100,000 이하입니다.

입출력 예

prices

return

[1, 2, 3, 2, 3]

[4, 3, 1, 1, 0]

비교적 빠른 시간 안에 아이디어를 잡고 구현까지 성공했다.

큐/스택 카테고리에 들어가있던 문제이지만 큐, 스택과는 관계없이 대소관계를 비교하며

이중 반복문으로 풀 수 있었다.

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

큐와 스택을 이용해서 푸는 풀이는 없나하고 다른 사람의 문제 풀이를 참조해봤지만

돌아가는 구조 자체는 위와 크게 다르지 않았다.

prices를 deque() 를 이용해서 덱으로 만든 다음 popleft 를 이용해 맨 왼쪽 값을 빼내는 것 정도.

큐/스택은 문제풀이에서 능수능란하게 다루기 어려운 것 같다.

728x90
반응형
728x90
반응형

문제 출처 : https://programmers.co.kr/learn/courses/30/lessons/49993

 

코딩테스트 연습 - 스킬트리

 

programmers.co.kr

문제 설명

선행 스킬이란 어떤 스킬을 배우기 전에 먼저 배워야 하는 스킬을 뜻합니다.

예를 들어 선행 스킬 순서가 스파크 → 라이트닝 볼트 → 썬더일때, 썬더를 배우려면 먼저 라이트닝 볼트를 배워야 하고, 라이트닝 볼트를 배우려면 먼저 스파크를 배워야 합니다.

위 순서에 없는 다른 스킬(힐링 등)은 순서에 상관없이 배울 수 있습니다. 따라서 스파크 → 힐링 → 라이트닝 볼트 → 썬더와 같은 스킬트리는 가능하지만, 썬더 → 스파크라이트닝 볼트 → 스파크 → 힐링 → 썬더와 같은 스킬트리는 불가능합니다.

선행 스킬 순서 skill과 유저들이 만든 스킬트리1를 담은 배열 skill_trees가 매개변수로 주어질 때, 가능한 스킬트리 개수를 return 하는 solution 함수를 작성해주세요.

제한 조건

스킬은 알파벳 대문자로 표기하며, 모든 문자열은 알파벳 대문자로만 이루어져 있습니다.

스킬 순서와 스킬트리는 문자열로 표기합니다.

예를 들어, C → B → D 라면 CBD로 표기합니다

선행 스킬 순서 skill의 길이는 1 이상 26 이하이며, 스킬은 중복해 주어지지 않습니다.

skill_trees는 길이 1 이상 20 이하인 배열입니다.

skill_trees의 원소는 스킬을 나타내는 문자열입니다.

skill_trees의 원소는 길이가 2 이상 26 이하인 문자열이며, 스킬이 중복해 주어지지 않습니다.

입출력 예

skill

skill_trees

return

"CBD"

["BACDE", "CBADF", "AECB", "BDA"]

2

정해진 스킬트리의 순서를 인식하고, 그 스킬트리의 순서에 맞게 스킬을 찍고 있는지를 확인하기 위해

skill문자열을 덱으로 바꿔서 popleft() 를 쓸 수 있게 했다.

저렇게 풀다가 막힌 부분이 CBD의 스킬트리에서 D까지 스킬을 다 찍었을 때 q에 더 이상 요소가 남아있지 않아 popleft()실행 시 IndexError가 발생한다는 점이었는데,

try except문을 사용함과 동시에 스킬트리 순서를 지킨 개수를 answer에 하나씩 더하는 것보다

시작과 동시에 주어진 skill_trees의 개수를 answer에 넣어두고 스킬트리 순서를 지키지 않은 개수를 answer에서 하나씩 빼는 방법으로 접근했다. 코드모양이 조금 길어진 것 같지만 다른 접근방법으로 해결할 수 있어서 기뻤다.

 

from collections import deque
def solution(skill, skill_trees):
    answer = len(skill_trees)
    for tree in skill_trees:        
        q = deque(skill)
        s = q.popleft()
        for v in tree:
            if v in q:
                answer -= 1
                break
            elif s == v:
                try:
                    s = q.popleft()
                except IndexError:
                    break
    return answer
728x90
반응형
728x90
반응형

문제출처 : https://programmers.co.kr/learn/courses/30/lessons/42587

 

코딩테스트 연습 - 프린터

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

programmers.co.kr

똑같은 백준 문제 : https://www.acmicpc.net/problem/1966

 

1966번: 프린터 큐

첫 줄에 test case의 수가 주어진다. 각 test case에 대해서 문서의 수 N(100이하)와 몇 번째로 인쇄되었는지 궁금한 문서가 현재 Queue의 어떤 위치에 있는지를 알려주는 M(0이상 N미만)이 주어진다. 다음

www.acmicpc.net

def solution(priorities, location):
    answer = 0
    priorities_copy = [0 for _ in range(len(priorities))]
    priorities_copy[location] = 1 
    while True:
        if priorities[0] == max(priorities):
            answer += 1
            if not priorities_copy[0]:
                del priorities[0] 
                del priorities_copy[0]
            else:break     
        else:
            priorities.append(priorities[0])
            priorities_copy.append(priorities_copy[0])
            del priorities_copy[0]
            del priorities[0]
    return answer

 

다른 사람의 풀이 보기를 해봤더니

python 내장함수인 any함수를 이용해서 푼 신기한 풀이가 있길래 공부가 되었다.

 

any함수를 이용한 풀이코드

def solution(priorities, location):
    queue =  [(i,p) for i,p in enumerate(priorities)]
    answer = 0
    while True:
        cur = queue.pop(0)
        if any(cur[1] < q[1] for q in queue):
            queue.append(cur)
        else:
            answer += 1
            if cur[0] == location:
                return answer

 

python any 함수는 반복 가능한(iterable) 자료형 x를 입력 인수로 받으며 이 x의 요소 중 하나라도 참이 있으면 True를 돌려주고, x가 모두 거짓일 때에만 False를 돌려주는 함수이다. 파이썬의 내장 함수이다.

 

>>> any([0, ""])
False
>>> any([])
False
>>> any([1,2,3,0])
True
728x90
반응형
728x90
반응형
    • 올바른 괄호

darklight

sublimevimemacs

Python3 

문제 설명

괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어

  • ()() 또는 (())() 는 올바른 괄호입니다.
  • )()( 또는 (()( 는 올바르지 않은 괄호입니다.

'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.

제한사항

  • 문자열 s의 길이 : 100,000 이하의 자연수
  • 문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.

입출력 예

sanswer

()() true
(())() true
)()( false
(()( false

입출력 예 설명

입출력 예 #1,2,3,4
문제의 예시와 같습니다

 

 

1차 : 실패한 풀이

def solution(s):
    answer = True
    while True:
        temp = s.replace('()','')
        if s == temp:
            break
        s = temp
    if not s:
        return True
    else: return False

결과는 테스트케이스에서 기대한 값과 같게 나왔지만 시간초과의 이유로 효율성 점수가 낮게 나왔다.

백준에서도 괄호의 완전성을 따지는 비슷한 문제가 있었는데,

그 때도 완전한 괄호를 replace로 바꾸면서 반복했을 때 시간초과가 났던 기억이 있어 다른 방법을 생각했다.

 

2차: 성공

def solution(s):
    t = []
    for i in s:
        if i=="(":
            t.append(i)
        else:
            if t:
                t.pop()
            else: return False
    if t: return False
    else: return True

스택으로 풀면 해결할 수 있다.

728x90
반응형

+ Recent posts