Algorithm 뽀개기 12

<COS Pro 1급 Java> [1차 #4번 문제] 타임머신

문제1 (구름 에듀에서 4번문제) 어느 누군가가 타임머신을 타고 과거로 가서 숫자 0이 없는 수 체계를 전파했습니다. 역사가 바뀌어 이제 사람들의 의식 속엔 0이란 숫자가 사라졌습니다. 따라서, 현재의 수 체계는 1, 2, 3, ..., 8, 9, 11, 12, ...와 같이 0이 없게 바뀌었습니다. 0을 포함하지 않은 자연수 num이 매개변수로 주어질 때, 이 수에 1을 더한 수를 return 하도록 solution 메소드를 완성해주세요. 매개변수 설명 자연수 num이 solution 메소드의 매개변수로 주어집니다. * num은 1 이상 999,999,999,999,999,999 이하의 0을 포함하지 않는 자연수입니다. return 값 설명 자연수 num에 1을 더한 수를 return 해주세요. 예시 ..

Algorithm 뽀개기 2023.09.28

순열, 조합

순열 서로 다른 n개에서 r개를 뽑아서 정렬하는 경우의 수 public class AlgorithmStudy { public static void permutation(int[] arr, int[] out, boolean[] visited, int depth, int r){ if(depth == r){ //(3) for(int num : out) System.out.print(num); return; } for(int i = 0; i < arr.length; i++){ //(1) if(!visited[i]){ visited[i] = true; out[depth] = arr[i]; permutation(arr, out, visited, depth+1, r); //(2) visited[i] = false; ..

[프로그래머스][Lvl1][Java][Javascript] 자연수 뒤집어 배열로 만들기

Lvl1. 자연수 뒤집어 배열로 만들기 문제 문제 설명 자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다. 제한 조건 n은 10,000,000,000이하인 자연수입니다. 입출력 예 n return 12345 [5,4,3,2,1] Java 내 코드 public int[] solution(long n) { String strN = String.valueOf(n); ArrayList arr = new ArrayList(); for(int i = strN.length() - 1 ; i > -1; i--){ arr.add(strN.charAt(i)); } return arr.stream().mapToInt(Character:..

[JavaScript 알고리즘을 위한 문법] 01. Math.max() Math.min()

Math.max(), Math.min() 입력값으로 받은 0개 이상의 숫자 중 가장 큰(작은) 숫자를 반환합니다. console.log(Math.max(-1, -3, -2)); // -1 const array1 = [1, 3, 2]; console.log(Math.max(...array1)); //3 문자열이 들어가도 됨 리턴하는 값의 타입은 Number const str = "-1 -2 -3 -4"; const arr = str.split(" "); console.log(Math.max(...arr)); //-1 console.log(typeof Math.max(...arr));number Math.ceil() - 올림 - always rounds up and returns the smallest in..

[DP - 다이나믹 프로그래밍] 냅색문제

대학생 때부터 나를 괴롭혔던 DP.. DP 뿌리를 뽑아버리자!! 아주 전형적인 DP의 대표적인 문제 0 - 1 냅색 문제이다. 문제 물건 A, B, C, D가 있고 각각의 value와 weight가 정의되어 있다. 가방에 최대로 넣을 수 있는 무게제한이 주어질 때 무게제한 안에서 최대한의 value로 물건을 가방에 담는 문제이다 다음과 같이 문제가 주어졌다고 하자. 무식하게 생각해볼까? 그냥 편하게 툭 생각해볼 수 있는 것은 Brute Force 방법이다. 각각의 물건을 담는다(T)와 담지 않는다(F)로 나뉠 수 있고 time complexity는 2^n 이다. 우리는 이것보다는 더 효율적으로 답을 구해내야만 한다..! DP를 적용할 수 있는 문제인지 여부는 다음을 판단해보면 된다. 더 작은 문제(sub..

최대공약수, 최소공배수 구하기 (유클리드 호제법)

Combination1 package step3_step2; import java.util.*; public class Combination1 { public static void main(String[] args) { int[] nums = {1,2,3,4}; //1. 조합(Combination) - visit 배열로 사용 여부 체크하는 방법 boolean[] visit1 = new boolean[nums.length]; combination1(nums, 4, 2, 0, visit1); System.out.println(); //2 조합(Combination) - 재귀 호출로 사용 여부 결정하는 방법 nCr //int[] ans1 = new int[2]; //combination2(nums, ans1 ..

Algorithm 뽀개기 2022.07.22

[Python] [프로그래머스] - 스킬트리

문제설명 skill_trees 리스트에 있는 문자열의 알파벳 순서가 skill 문자열의 순서대로 이루어져있는지 판단하고 그 갯수를 리턴하는 문제입니다. 입출력 예를 봐도 알 수 있지만, 여기서 주의할 점은 skill_trees의 "BDA"는 불가능한 스킬 트리입니다. B와 D의 순서는 맞았지만 B를 위해 선행되어야 하는 C가 없기 때문입니다. 그렇지만 "CBA"는 가능합니다. skill의 문자열 "CBD"와 같이 "CBA"는 C -> B로 스킬 순서가 되므로 아무 문제가 없고 D는 없지만 순서가 중요하지 모든 skill의 문자열이 포함되어야 하는 것은 아닙니다. 접근방법 skill 문자열의 가장 마지막 문자부터 처음 문자까지 포문을 돌면서 유저의 문자열에 해당 문자열이 있는지 체크하고 now_idx를 갱..

[Python] [프로그래머스] - 구명보트

문제 설명 무인도에 갇힌 사람을 2명씩 구명보트로 구출할 수 있는데 두 명의 몸무게 합이 구명보트가 최대로 구조할 수 있는 무게 이하여야 한다는 제한이 있을 때 필요한 구명보트의 갯수를 구하는 간단한 문제입니다. 접근 방법 처음에는 간단히 몸무게 순으로 오름차순 정렬을 하고 앞사람부터 둘씩 짝지어서 구명보트 최대 무게 제한 이하의 몸무게라면 구출을 하는 방향으로 생각했습니다. 예를들어 people = [50, 50, 70, 80] 이면 50kg인 두명을 먼저 구출하고 그다음 차례로 70, 80kg인 사람을 구출하는거죠 But!! 이렇게 하면 people = [5,5,20,20,80,80] 일 경우 구명보트는 4개가 필요하지만 실제로는 3개로도 충분히 구출할 수 있습니다. 20+80을 해서 100kg를 맞..

[Python][프로그래머스] - 거리두기 확인하기

입출력 예 places result [["POOOP", "OXXOX", "OPXPX", "OOXOX", "POXXP"], ["POOPX", "OXPXP", "PXXXO", "OXXXO", "OOOPP"], ["PXOPX", "OXOXP", "OXPOX", "OXXOP", "PXPOX"], ["OOOXX", "XOOOX", "OOOXX", "OXOOX", "OOOOO"], ["PXPXP", "XPXPX", "PXPXP", "XPXPX", "PXPXP"]] [1, 0, 1, 1, 1] 내풀이 from itertools import combinations def solution(places): answer = [] p_collect=[] for pan in places: p_collect = [] for r ..

[python][프로그래머스] - 주식가격

내 풀이 def solution(prices): answer = [] prices_len = len(prices) answer.append(0) for i in range(prices_len-2,-1,-1): for j in range(i+1,prices_len): price_down = False if prices[i] > prices[j]: #가격이 떨어짐 answer.append(j-i) price_down = True break if price_down == False : answer.append(j-i) return list(reversed(answer)) 예제 처럼 [1,2,3,2,3]이 들어왔을 때 마지막 주식가격(3)은 가격이 떨어지는 시간이 0초 이므로 일단 0을 추가해주고 시작했습니다...