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 해도 된다.

728x90

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

 

코딩테스트 연습 - H-Index

H-Index는 과학자의 생산성과 영향력을 나타내는 지표입니다. 어느 과학자의 H-Index를 나타내는 값인 h를 구하려고 합니다. 위키백과1에 따르면, H-Index는 다음과 같이 구합니다. 어떤 과학자가 발표

programmers.co.kr

출처 : 프로그래머스


def solution(citations):
    citations.sort(reverse = True)
    print(citations)
    
    for idx, cita in enumerate(citations):
        print(idx, cita)
        if idx >= cita:
            return idx
    return len(citations)

풀이

내림차순으로 정렬하고 idx랑 값을 같이 출력해본다.

그릐고 문제를 이해해보면 쉽게 풀 수 있다.

728x90

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

 

코딩테스트 연습 - 게임 맵 최단거리

[[1,0,1,1,1],[1,0,1,0,1],[1,0,1,1,1],[1,1,1,0,1],[0,0,0,0,1]] 11 [[1,0,1,1,1],[1,0,1,0,1],[1,0,1,1,1],[1,1,1,0,0],[0,0,0,0,1]] -1

programmers.co.kr

from collections import deque

def solution(maps):
    dx = [-1, 0, 1, 0]
    dy = [0, -1, 0, 1]
    n = len(maps)
    m = len(maps[0])
    visited = [[-1]*m for _ in range(n)]
    q = deque()
    q.append([0,0])
    visited[0][0] = 1
    
    while q:
        x, y = q.popleft()
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if 0<=nx<n and 0<=ny<m and maps[nx][ny] == 1: # 벽이 없으면
                if visited[nx][ny] == -1: 
                    visited[nx][ny] = visited[x][y] + 1
                    q.append([nx,ny])       
    return visited[-1][-1]

풀이

bfs 를 사용해서 푸는 간단한 풀이다.

다만, 최단경로의 최소값을 구해야되는데, 도달하지 못하면 -1을 리턴해야하니까

처음에 visited 방문처리 초기값을 평소 주던 0이 아닌 -1로 준다.

728x90

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

 

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

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

programmers.co.kr

출처 : 프로그래머스


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

풀이

문자열 s를 하나씩 비교해서 같은 문자가 2개 있으면 없애주고, 아니면 남기는 것을 반복적으로 해야한다.

 

stack 자료구조를 사용했다.

문자열 s에서 문자 하나씩을 stack에 넣어준다.

stack에 맨 위 문자랑 넣으려는 문자가 같으면 연속 2개가 같으니 pop해서 없애준다.

같지 않거나 stack이 비었으면 추가해준다.

+ Recent posts