프로그래머스 - 디스크 컨트롤러
Computer Science/Problem Solving
문제 설명제한사항 및 입출력풀이문제 설명에서 볼 수 있듯이 각 작업에 우선순위가 주어지고 이 우선순위(소요시간, 요청 시각)를 기반으로 작업을 처리해야한다. 작업 큐에서 매번 가장 작은 우선순위를 순회하며 찾을 순 없으니 힙(heap)을 사용하여 가장 작은 우선순위를 빠르게 찾을 수 있도록 해주었다. 또한 소요시간과 요청 시각이 같다면 작업의 번호가 작은 것을 우선순위로 본다고 했는데, 사실 소요시간과 요청 시각이 같다면 무엇을 먼저 처리하든 구하려는 정답에는 차이가 없기 때문에 제외하고 2가지만 고려해주었다.내 코드from heapq import heappush, heappopfrom collections import dequedef solution(jobs): # 요청 시각 기준으로 정렬 ..
프로그래머스 - [1차] 캐시 (2018 KAKAO BLIND)
Computer Science/Problem Solving
문제 설명제한사항 및 입출력풀이사실 LRU를 LFU로 착각하고 풀이하다가 이상함을 느끼고 고쳤다... 문제를 똑바로 읽자별다른 알고리즘은 없는 것 같고 큐를 이용한 구현 문제인 것 같다. 주어진 캐시 크기만큼 배열을 유지해주면서 구현해주었다.내 코드from collections import dequedef solution(cacheSize, cities): if cacheSize == 0: return 5 * len(cities) ans = 0 cache = deque([]) for city in cities: # 대소문자 구분 없으니까 정규화 city = city.lower() if city in cache: a..
프로그래머스 - 거리두기 확인하기
Computer Science/Problem Solving
문제 설명제한사항 및 입출력풀이왜 이런 문제만 보면 bfs에 사로잡히는건지 모르겠다. 틀에 갇힌 사고가 되어버린 것만 같지만 그래도 가장 먼저 생각한 알고리즘으로 풀이해보기로 했다..각 응시자의 자리에서 bfs를 돌리면서 맨해튼 거리 내에 사람이 있는지 확인해주었다. while 루프 내에 for문으로 queue의 길이를 재서 각 탐색을 구분하여 맨해튼거리를 쟀다. bfs를 돌릴 때 파티션은 그냥 안가면 올바른 맨해튼 거리를 도출할 수 있다. 이후 한 명이라도 위반했다면 0으로 세팅하고 ans 배열에 넣어주었다. 내 코드from collections import dequedx = [0, 1, -1, 0]dy = [1, 0, 0, -1]def bfs(matrix, sx, sy): queue = dequ..
프로그래머스 - 조이스틱
Computer Science/Problem Solving
문제 설명제한사항 및 입출력풀이문제가 참 간단명료하다. A로 초기화된 문자열을 상하좌우로 움직여 목표 문자열로 바꾸는 문제이다. 상하는 고정되어있기 때문에 아스키코드를 이용해서 최솟값을 구해주었다. 주의할 점은 좌우로 움직일 때 목표 문자열의 연속된 A 구간을 만난다면 직진하는 것보다 돌아가는 것이 더 빠를 수도 있다는 것이다. 뭔가 수학적으로 접근할 수도 있을 것 같아서 고민을 해보았는데,,, 잘 되진 않았다.그냥 첫 번째 칸부터 전부 확인하면서 어느 구간에서 꺾는 것이 더 빠른지 모두 계산해주면서 풀이해주었다.내 코드def solution(name): n = len(name) updown = sum(min(ord(c) - 65, 26 - (ord(c) - 65)) for c in name)..
프로그래머스 - 메뉴 리뉴얼
Computer Science/Problem Solving
문제 설명제한사항 및 입출력풀이역시 카카오답게 문제가 쉽지않다. 정리해보자면 손님이 단품으로 주문한 메뉴들과 만들어야하는 코스요리에 포함되어야하는 단품 요리 수가 주어지고, 만들어야하는 코스 요리의 제약조건은 다음과 같다.1. 2개 이상의 메뉴로 이루어져야함.2. 2명 이상의 손님이 주문한 메뉴여야함3. 각 코스요리 별로 가장 많이 주문된 메뉴 구성을 사전순으로 출력 (만약 같다면 모두 출력) 이를 위해 역시 가장 먼저 생각난 방법은 조합이다. orders와 course의 배열 크기가 작아 모든 조합을 찾을 수 있다는 생각이 들었다. 각 주문들을 순회하며 주어진 코스요리의 개수만큼 모든 조합을 만들고, 해시맵으로 관리하면서 이미 존재한다면 나온 수를 올려주고 없다면 추가해주는 방식으로 풀이하였다.내 코드..
프로그래머스 - 서버 증설 횟수
Computer Science/Problem Solving
문제 설명제한사항 및 입출력풀이별다른 알고리즘적 사고가 필요하다기보단 구현을 확인하는 문제인 것 같다. 현재 활성화된 서버를 트래킹하고 필요한만큼 추가해서 24시간 내에 몇 번이나 증설되었는지 구해주었다.내 코드def solution(players, m, k): n = len(players) diff = [0] * (n + k + 1) active = 0 ans = 0 for t, p in enumerate(players): # 만료 처리 (이전까지의 증설 중 이번 시점에 만료되는 서버 반영) active += diff[t] needed = p // m if needed > active: add = neede..
프로그래머스 - 등굣길
Computer Science/Problem Solving
문제 설명제한사항 및 입출력풀이정말 정석적인 DP 문제이다. 추가적으로 가지 못하는 타일만 고려해주면 된다. dp[i][j] = [0, 0]에서 [i, j]까지 도달할 수 있는 방법의 수내 코드MOD = 10**9 + 7def solution(m, n, puddles): dp = [[0] * m for _ in range(n)] for x, y in puddles: dp[y-1][x-1] = -1 for i in range(m): if dp[0][i] == -1: break dp[0][i] = 1 for i in range(n): if dp[i][0] == -1: break dp[i][0] = 1 ..
프로그래머스 - k진수에서 소수 개수 구하기
Computer Science/Problem Solving
문제 설명제한사항 및 입출력풀이카카오 문제답게 설명이 친절하다. 글이 많아 조금 복잡해보이지만 주어진 숫자 n을 k진수로 바꾸고 0으로 split한 후 나온 숫자들이 소수인지 판별하는 문제이다.별다른 알고리즘이 있는 것 같지는 않고 그냥 구현 문제같다.내 코드def convert_to_k(n, k): if n == 0: return "0" ret = [] while n > 0: ret.append(str(n % k)) n //= k return "".join(reversed(ret))def is_prime(x): if x n을 k진수로 변환한 수에서 0으로 split했을 때 나올 수 있는 수들을 각각 소수 판별하기 때문..