문제

 

www.acmicpc.net/problem/10845

 

10845번: 큐

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지

www.acmicpc.net

 

처음 작성한 코드

from collections import deque
import sys

n = int(sys.stdin.readline())
queue = deque()

for i in range(n):
    tmp = sys.stdin.readline().split()
    if tmp[0] == 'push':
        queue.append(tmp[1])
    elif tmp[0] == 'pop':
        print(queue.popleft()) if queue else print(-1)
    elif tmp[0] == 'size':
        print(len(queue))
    elif tmp[0] == 'empty':
        print(0) if queue else print(1)
    elif tmp[0] == 'front':
        print(queue[0]) if queue else print(-1)
    elif tmp[0] == 'back':
        print(queue[-1]) if queue else print(-1)

 

'Baekjoon' 카테고리의 다른 글

[백준 4949] 균형잡힌 세상  (0) 2021.02.14
[백준 10828] 스택  (0) 2021.02.12
[백준 10773] 제로  (0) 2021.02.12
[백준 9012] 괄호  (0) 2020.10.16
[백준 1920] 수 찾기  (0) 2020.10.16

문제

 

www.acmicpc.net/problem/10773

 

10773번: 제로

첫 번째 줄에 정수 K가 주어진다. (1 ≤ K ≤ 100,000) 이후 K개의 줄에 정수가 1개씩 주어진다. 정수는 0에서 1,000,000 사이의 값을 가지며, 정수가 "0" 일 경우에는 가장 최근에 쓴 수를 지우고, 아닐 경

www.acmicpc.net

 

처음 작성한 코드

import sys

n = int(sys.stdin.readline())
stack = []

for i in range(n):
    tmp = int(sys.stdin.readline())
    if tmp!=0:
        stack.append(tmp)
    else:
        stack.pop()
print(sum(stack))

'Baekjoon' 카테고리의 다른 글

[백준 10828] 스택  (0) 2021.02.12
[백준 10845] 큐  (0) 2021.02.12
[백준 9012] 괄호  (0) 2020.10.16
[백준 1920] 수 찾기  (0) 2020.10.16
[백준 1181] 단어 정렬  (0) 2020.10.05

문제

문제

 

programmers.co.kr/learn/courses/30/lessons/17683

 

코딩테스트 연습 - [3차] 방금그곡

방금그곡 라디오를 자주 듣는 네오는 라디오에서 방금 나왔던 음악이 무슨 음악인지 궁금해질 때가 많다. 그럴 때 네오는 다음 포털의 '방금그곡' 서비스를 이용하곤 한다. 방금그곡에서는 TV,

programmers.co.kr

 

처음 작성한 코드

def solution(m, musicinfos):
    answer = ''
    maxTime = 0
    m = m.replace('C#','c').replace('D#','d').replace('F#','f').replace('G#','g').replace('A#','a')
    for i in musicinfos:
        tmp = i.split(',')
        runningTime = (int(tmp[1].split(':')[0]) - int(tmp[0].split(':')[0]))*60 + (int(tmp[1].split(':')[1]) - int(tmp[0].split(':')[1]))
        tmp[3] = tmp[3].replace('C#','c').replace('D#','d').replace('F#','f').replace('G#','g').replace('A#','a')
        mok, namaji = divmod(runningTime, len(tmp[3]))
        music = tmp[3]*mok+tmp[3][:namaji]
        if m in music:
            if maxTime < runningTime:
                maxTime = runningTime
                answer = tmp[2]
    return answer if answer else "(None)"

 

깨달은 점

  • 카카오 코테는 문제 조건만 맞추면 거의 대부분 통과한다. (효율성 테스트 없을때...^^)
  • 반환할 때, return answer if 조건 else 반환값 이런 식으로도 사용할 수 있다.
  • 사람들 생각하는 거 다 비슷하다..

문제

문제

programmers.co.kr/learn/courses/30/lessons/17686

 

코딩테스트 연습 - [3차] 파일명 정렬

파일명 정렬 세 차례의 코딩 테스트와 두 차례의 면접이라는 기나긴 블라인드 공채를 무사히 통과해 카카오에 입사한 무지는 파일 저장소 서버 관리를 맡게 되었다. 저장소 서버에는 프로그램

programmers.co.kr

 

처음 작성한 코드

def solution(files):
    import re
    answer = [[i,re.findall('([a-zA-Z-.]+)(\d+)',files[i].lower())] for i in range(len(files))]
    answer.sort(key= lambda x:(x[1][0][0],int(x[1][0][1])))
    result = []
    for i in answer:
        result.append(files[i[0]])
    return result
  1. 문자와 숫자 부분을 정규식을 통해 나눈다.
  2. 문자부분과 숫자부분을 key로 하여 정렬한다.
  3. 정렬된 배열에 인덱스를 참조하여 반환할 배열에 넣어준다.

answer 초기 값들

 -> 처음에 index를 함께 넣어서 정렬이 됐을 때, 만약 5,2,3,4,1 이렇게 되면 5번째 인덱스 먼저 append하게 짜려고 index도 함께 저장했다.

 

깨달은 점

  • 정규식에 대해 한번 더 짚고 넘어간다. '?' 이걸 쓰면 있어도 되고 없어도 된다는 뜻이다.
  • 코드에서 [a-zA-Z-. ]라고만 안하고 ( ) 이걸로 묶은 이유는 그렇게 되면 [문자, 숫자] 배열로 뽑아주기 때문이다. ( )이걸로 안 묶으면 그냥 문자열로 뽑아준다.
  • sort 할 때, key를 두개 줄 수 있다. 여기서는 첫째로 문자를 하고 첫째가 같으면 숫자로 판별하는 ? 그렇게 하기 때문에 key를 저렇게 줬다. x[1][0][0]가 문자고 x[1][0][1]가 문자열형식의 숫자 즉 '123' 이거라 int로 형변환 했다.

'Programmers' 카테고리의 다른 글

[프로그래머스] 방금그곡  (0) 2021.02.08
[프로그래머스] n진수 게임  (0) 2021.02.05
[프로그래머스] 짝지어 제거하기  (0) 2021.01.30
[프로그래머스] 폰켓몬  (0) 2021.01.30
[프로그래머스] 소수 만들기  (0) 2021.01.28

문제

문제

programmers.co.kr/learn/courses/30/lessons/17687

 

처음 작성한 코드

def tenToWhat(num,what):
    result = []
    remain = ['A','B','C','D','E','F']
    while num:
        num, namaji = divmod(num,what)
        if namaji>=10:
            namaji-=10
            result.append(remain[namaji])
        else: result.append(str(namaji))
    return ''.join(result[::-1])

def solution(n, t, m, p):
    num = 1
    tmp = '0'
    while True:
        if len(tmp)>t*m:
        	tmp = tmp[:t*m]
            break
        tmp+= tenToWhat(num, n)
        num+=1
    answer = [tmp[i] for i in range(len(tmp)) if i%m==p-1]
    return ''.join(answer)

 

코드 리뷰 후

def tenToWhat(num,what):
    result = []
    remain = ['A','B','C','D','E','F']
    while num:
        num, namaji = divmod(num,what)
        if namaji>=10:
            namaji-=10
            result.append(remain[namaji])
        else: result.append(str(namaji))
    return ''.join(result[::-1])

def solution(n, t, m, p):
    num = 1
    tmp = '0'
    while True:
        if len(tmp)>t*m:
            break
        tmp+= tenToWhat(num, n)
        num+=1
    answer = tmp[p-1::m][:t]
    return ''.join(answer)

 

깨달은 점

  • array[a:b:c]의 사용법을 알게되었다. a부터 b까지 c의 간격만큼의 의미를 갖고있다. 사람수(m)만큼 간격을 가지면서 p-1부터 시작하면 그게 맞는 값이 answer에 저장되고 문자열로 반환하게 작성하였다.

문제

문제

programmers.co.kr/learn/courses/30/lessons/12973

 

코딩테스트 연습 - 짝지어 제거하기

짝지어 제거하기는, 알파벳 소문자로 이루어진 문자열을 가지고 시작합니다. 먼저 문자열에서 같은 알파벳이 2개 붙어 있는 짝을 찾습니다. 그다음, 그 둘을 제거한 뒤, 앞뒤로 문자열을 이어 붙

programmers.co.kr

 

처음 작성한 코드

def solution(s):
    stack = []
    for i in s:
        if not stack:
            stack.append(i)
            continue
        if stack[-1] == i:
            stack.pop()
        else: stack.append(i)
    if stack: return 0
    else: return 1

 

깨달은 점

  • 처음에 이중포문 가지고 코드를 작성했는데 시간초과가 너무 많이나서 스트레스 받다가 스택 사용하라는 힌트를 보고 스택으로 바꿔서 풀었더니 바로 통과했다... 저걸 보고 어떻게 스택 생각을 해? ㅋㅋ 재밌네~

문제

문제

programmers.co.kr/learn/courses/30/lessons/1845

 

코딩테스트 연습 - 폰켓몬

당신은 폰켓몬을 잡기 위한 오랜 여행 끝에, 홍 박사님의 연구실에 도착했습니다. 홍 박사님은 당신에게 자신의 연구실에 있는 총 N 마리의 폰켓몬 중에서 N/2마리를 가져가도 좋다고 했습니다.

programmers.co.kr

 

처음 작성한 코드

def solution(nums):
    leng = len(nums)//2
    nums = set(nums)
    if len(nums)<leng:
        return len(nums)
    return leng

 

코드 리뷰 후

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

 

깨달은 점

  • 처음에는 combinations를 사용하여 모든 조합을 만들어놓고 set(len())을 이용하여 길이가 제일 긴 조합의 길이를 반환하려고 했는데 시간 초과가 났다. 그래서 다시 생각해보니까 먼저 set()을 걸어놓으면 될 것 같았다. set을 해놓고 leng만큼 combinations을 했는데 컴파일 에러가 났다. 이유를 생각해보니 만약 nums = [1,1,1,1] 이면 set(nums) -> {1} 이게 되고 leng == 2이기 때문에 에러가 나는 것이었다. 그러면 처음에 set(nums)와 leng을 비교하여 위와 같은 경우라면(set()이 더 작으면) set(nums)의 길이를 반환하고, 아니면 combinations을 또 해서 그 중 길이가 제일 긴 조합의 길이를 반환하려고 했는데 생각해보니 저 위의 조건에서 안 걸리면 어찌됐든 len(nums)//2 만큼 뽑히는 거기 때문에 그냥 len(nums)//2를 반환하게 작성했다.

문제

문제

programmers.co.kr/learn/courses/30/lessons/12977

 

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

주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때

programmers.co.kr

 

처음 작성한 코드

def solution(nums):
    from itertools import combinations
    answer = 0
    hubo = combinations(nums,3)
    for i in [sum(i) for i in hubo]:
        for j in range(2,i):
            if i%j == 0:break
        else: answer+=1
    return answer

 

문제

문제

 

programmers.co.kr/learn/courses/30/lessons/12981

 

코딩테스트 연습 - 영어 끝말잇기

3 [tank, kick, know, wheel, land, dream, mother, robot, tank] [3,3] 5 [hello, observe, effect, take, either, recognize, encourage, ensure, establish, hang, gather, refer, reference, estimate, executive] [0,0]

programmers.co.kr

 

처음 작성한 코드

def solution(n, words):
    for i in range(1, len(words)):
        if words[i] in words[:i] or words[i-1][-1] != words[i][0]:
            th, who = divmod(i,n)
            return [who+1, th+1]
    else:
        return [0,0]

 

깨달은 점

  • for-else문 좋다.