개발일지/알고리즘
-
문제 - 라면 공장개발일지/알고리즘 2021. 12. 27. 23:01
# 문제 Q. 라면 공장에서는 하루에 밀가루를 1톤씩 사용합니다. 원래 밀가루를 공급받던 공장의 고장으로 앞으로 k일 이후에야 밀가루를 공급받을 수 있기 때문에 해외 공장에서 밀가루를 수입해야 합니다. 해외 공장에서는 향후 밀가루를 공급할 수 있는 날짜와 수량을 알려주었고, 라면 공장에서는 운송비를 줄이기 위해 최소한의 횟수로 밀가루를 공급받고 싶습니다. 현재 공장에 남아있는 밀가루 수량 stock, 밀가루 공급 일정(dates)과 해당 시점에 공급 가능한 밀가루 수량(supplies), 원래 공장으로부터 공급받을 수 있는 시점 k가 주어질 때, 밀가루가 떨어지지 않고 공장을 운영하기 위해서 최소한 몇 번 해외 공장으로부터 밀가루를 공급받아야 하는지를 반환 하시오. dates[i]에는 i번째 공급 가능일..
-
문제 - 베스트 앨범개발일지/알고리즘 2021. 12. 27. 22:46
# 문제 Q. 멜론에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 한다. 노래는 인덱스 구분하며, 노래를 수록하는 기준은 다음과 같다. 1. 속한 노래가 많이 재생된 장르를 먼저 수록한다. (단, 각 장르에 속한 노래의재생 수 총합은 모두 다르다.) 2. 장르 내에서 많이 재생된 노래를 먼저 수록한다. 3. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록한다. 노래의 장르를 나타내는 문자열 배열 genres와 노래별 재생 횟수를 나타내는 정수 배열 plays가 주어질 때, 베스트 앨범에 들어갈 노래의 인덱스를 순서대로 반환하시오. # 예시 # 1 genres = ["classic", "pop", "classic", "classic", "pop..
-
문제 - 올바른 괄호개발일지/알고리즘 2021. 12. 27. 22:35
# 문제 Q. 괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻이다. 예를 들어 ()() 또는 (())() 는 올바르다. )()( 또는 (()( 는 올바르지 않다. 이 때, '(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 True 를 반환하고 아니라면 False 를 반환하시오. # 예시 "(())()" # True "((((" # False # 문제풀이 해당 문제는 짝을 맞춰야하는 것이 키포인트 였다. 괄호의 경우 한번 열었다면 닫힘이 나올때까지 기억하고 있다가 수를 세어야하고 여는 괄호를 2개를 열었다면 해당 괄호에 맞게 하나씩 늦게 들어온 것부터 맞춰 나가야한다. 따라서 이런 구조에는 Stack 구조가 어울..
-
문제 - 쓱 최대로 할인개발일지/알고리즘 2021. 12. 27. 20:57
# 문제 [30000, 2000, 1500000] # 상품의 가격 [20, 40] # 쿠폰, 할인율의 단위는 % 입니다. 다음과 같이 숫자로 이루어진 배열이 두 개가 있다. 하나는 상품의 가격을 담은 배열이고, 하나는 쿠폰을 담은 배열이다. 쿠폰의 할인율에 따라 상품의 가격을 할인 받을 수 있다. 이 때, 최대한 할인을 많이 받는다면 얼마를 내야 하는가? 단, 할인쿠폰은 한 제품에 한 번씩만 적용 가능하다. # 풀이 과정 해당 문제는 보자마자 푸는 방법이 떠오를 정도로 일상생활에서 가깝에 느끼던 문제였다. 할인율을 최대로 적용하고 싶다면 가장 큰 가격에 높은 할인을 적용해아 한다라는 생각을 하니 정렬을 이용해야겠다는 생각을 했다 . 가격과 할인율을 내림차순으로 정렬 한 뒤 각 원소에서 한개씩 뽑아 곱해주..
-
문제 - 더하거나 빼거나개발일지/알고리즘 2021. 12. 27. 20:49
# 문제 Q. 음이 아닌 정수들로 이루어진 배열이 있다. 이 수를 적절히 더하거나 빼서 특정한 숫자를 만들려고 한다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들기 위해서는 다음 다섯 방법을 쓸 수 있다. -1+1+1+1+1 = 3 +1-1+1+1+1 = 3 +1+1-1+1+1 = 3 +1+1+1-1+1 = 3 +1+1+1+1-1 = 3 사용할 수 있는 숫자가 담긴 배열 numbers, 타겟 넘버 target_number이 매개변수로 주어질 때 숫자를 적절히 더하고 빼서 타겟 넘버를 만드는 방법의 수를 반환하시오. 해당 문제를 처음 밨을 때는 부호를 배치해야하고 -1 + 1 = 0 이므로 3을 만드려면 (+1, -1 ) 2개씩 짝지어 배치하면 되는 문제인 줄 알고 조합 문제로 받아드렸다. 따..
-
문제 - 배달의 민족 배달 가능 여부개발일지/알고리즘 2021. 12. 27. 20:26
# 문제 Q. 배달의 민족 서버 개발자로 입사했다. 상점에서 현재 가능한 메뉴가 ["떡볶이", "만두", "오뎅", "사이다", "콜라"] 일 때, 유저가 ["오뎅", "콜라", "만두"] 를 주문했다. 그렇다면, 현재 주문 가능한 상태인지 여부를 반환하시오. # 풀이과정 해당 문제는 주문 목록 중 주문한 요리가 있으면 되는 문제로 주문을 순회하면서 메뉴에 있는지 파악해도 되지만 시간을 단추하기 위해 정렬 하여 순회하도록 하면 조금 더 빠르게 구할 수 있다고 생각했다. shop_menus = ["만두", "떡볶이", "오뎅", "사이다", "콜라"] shop_orders = ["오뎅", "콜라", "만두", "햄버거"] def is_available_to_order(menus, orders): shop_..
-
문제 - 문자열 뒤집기개발일지/알고리즘 2021. 12. 27. 15:47
# 문제 Q. 0과 1로만 이루어진 문자열이 주어졌을 때, 이 문자를 모두 0, 혹은 모두 1로 같게 만들어야 한다. 할 수 있는 행동은 연속된 하나의 숫자를 잡고 모두 뒤집는 것 이다. 뒤집는 것은 1을 0으로, 0을 1로 바꾸는 것을 의미한다. 주어진 문자열을 모두 0 혹은 모두 1로 같게 만드는 최소 횟수를 반환하시오. # 예시 input : "0001100" 이 문자열을 모두 0 혹은 1로 만들기 위해서는 두가지 방법이 있습니다. 1. 모두 0으로 만드는 방법 1) 4번째 원소와 5번째 원소를 잡고 뒤집으면? `0000000` 이 됩니다. 문자열을 순서대로 탐색하다보면 뒤집는 시점은 바로 0에서 1로 변할 때 뒤집어야 하는 걸 감지할 수 있습니다! 2. 모두 1으로 만드는 방법 1) 1번째 원소와..
-
문제 - 소수 나열하기개발일지/알고리즘 2021. 12. 27. 15:09
#문제 정수를 입력했을 때, 그 정수 이하의 소수를 모두 반환하시오 # 예시 # 20 입력한다면 answer : [ 2, 3, 5, 7, 11, 13, 17, 19 ] # 나의 풀이과정 소수는 1, 자기자신으로만 나누어 떨어져야하기 때문에 각 숫자들이 처음 부터 자기자신까지 순서대로 반복하면서 나누어야하므로 이중 for문을 이용하였다. for문을 이용하여 목표 숫자까지 도달하며 각 숫자들은 2부터 자기자신 -1 을 순서대로 나누어서 나누어 떨어지는 것이 있다면 바로 반복문을 빠져나와 다음 숫자로 이동하도록 코드를로 구현했다. 해당 값동안 나누어 떨어지지 않았다면 소수라는 뜻으로 결과 리스트에 추가 하였음 # 전체 코드 input = 20 def find_prime_list_under_number(numb..