목록algorithm (41)
2020.코딩일지
문제 아래와 같은 과정을 거쳐 부등호 수(inequalityNumber)를 만들 수 있습니다. 최대 9개의 부등호()가 주어집니다. 부등호의 좌우에는 0부터 9사이의 숫자가 한 번씩만 들어가야 합니다. 부등호를 만족하는 숫자의 조합을 차례대로 이어 붙여 만든 정수를 부등호 수라고 한다. 부등호 기호들을 입력받아 부등호를 만족하는 최대 부등호 수와 최소 부등호 수의 차이를 리턴해야 합니다. 입력 인자 1 : signs string 타입의 공백을 사이에 둔 부등호 기호들 signs.length는 17 이하 (최대 9개의 부등호 기호) 출력 number 타입을 리턴해야 합니다. 주의사항 첫 자리가 0인 경우도 부등호 수에 포함되어야 합니다. 모든 입력에 답은 항상 존재합니다. 입출력 예시 let output ..
LPS 문제 문자열을 입력받아 다음의 조건을 만족하는 LPS*를 찾아 그 길이를 리턴해야 합니다. LPS: 주어진 문자열의 가장 긴 접두어이자 접미어(Longest Prefix which is also Suffix) non-overlapping: 접두어와 접미어는 서로 겹치는 부분이 없어야 합니다. 다시 말해, prefix와 suffix는 문자열의 동일한 인덱스에 위치한 문자를 요소로 가지면 안 됩니다. 입력 인자 1 : str string 타입의 임의의 알파벳 소문자 문자열 ( str.length는 60,000 이하 출력 number 타입을 리턴해야 합니다. 주의사항 prefix(접두어)는 문자열의 첫 인덱스부터 시작하는 모든 부분 문자열을 의미합니다. suffix(접미어)는 문자열의 마지막 인덱스부터..
문제 하나의 집합을 의미하는 문자열을 입력받아 각 문자를 가지고 만들 수 있는 모든 부분집합을 리턴해야 합니다. 입력 인자 1 : str string 타입의 공백이 없는 알파벳 소문자 문자열 출력 배열(arr)을 리턴해야 합니다. arr[i]는 각 부분집합의 원소로 구성된 문자열 주의사항 arr[i]는 각 부분집합을 구성하는 원소를 연결한 문자열입니다. arr[i]는 알파벳 순서로 정렬되어야 합니다. 집합은 중복된 원소를 허용하지 않습니다. 부분집합은 빈 문자열을 포함합니다. arr은 사전식 순서(lexical order)로 정렬되어야 합니다. 입출력 예시 let output1 = powerSet('abc'); console.log(output1); // ['', 'a', 'ab', 'abc', 'ac'..
문제 두 수를 입력받아 거듭제곱을 리턴해야 합니다. 입력 인자 1: base number 타입의 자연수 (base >= 2) 인자 2: exponent number 타입의 정수 (exponent >= 0) 출력 number 타입을 리턴해야 합니다. 실제 계산 결과를 94,906,249로 나눈 나머지를 리턴해야 합니다. 주의사항 Math.pow, 거듭제곱 연산자 사용은 금지됩니다. 시간복잡도 O(logN)을 만족해야 합니다. 나머지를 구하는 이유는 계산 결과가 컴퓨터로 나타낼 수 있는 수의 범위를 넘을 수 있기 때문입니다. 하지만 모든 연산이 끝난 뒤에 그 결과를 94,906,249로 나누려고 해서는 안 됩니다. 연산 중간에도 이 범위를 넘을 수 있기 때문에, 연산을 할 때마다 나머지를 구하고 그 결과에 ..
문제 정수를 요소로 갖는 배열을 입력받아 3개의 요소를 곱해 나올 수 있는 최대값을 리턴해야 합니다. 입력 인자 1 : arr number 타입을 요소로 갖는 임의의 배열 출력 number 타입을 리턴해야 합니다. 주의사항 입력으로 주어진 배열은 중첩되지 않은 1차원 배열입니다. 배열의 요소는 음수와 0을 포함하는 정수입니다. 배열의 길이는 3 이상입니다. 입출력예시 더보기 입출력예시 let output = largestProductOfThree([2, 1, 3, 7]); console.log(output); // --> 42 (= 2 * 3 * 7) output = largestProductOfThree([-1, 2, -5, 7]); console.log(output); // --> 35 (= -1 *..
O(1) 상수 시간 문제를 해결하는데 오직 한 단계만 처리함. O(log n) 로그 시간 문제를 해결하는데 필요한 단계들이 연산마다 특정 요인에 의해 줄어듬. O(n) 직선적 시간 문제를 해결하기 위한 단계의 수와 입력값 n이 1:1 관계를 가짐. O(n log n) 문제를 해결하기 위한 단계의 수가 N*(log2N) 번만큼의 수행시간을 가진다. (선형로그형) O(n^2) 2차 시간 문제를 해결하기 위한 단계의 수는 입력값 n의 제곱. O(C^n) 지수 시간 문제를 해결하기 위한 단계의 수는 주어진 상수값 C 의 n 제곱. https://blog.chulgil.me/algorithm/ 알고리즘의 시간 복잡도와 Big-O 쉽게 이해하기 삼성역에서 택시를 타고 강남역으로 향했는데 30분 걸렸다. 구글에서 알..
문제 정수를 요소로 갖는 배열을 입력받아 오름차순으로 정렬하여 리턴해야 합니다. 버블 정렬(bubble sort)은 여러 정렬 알고리즘(삽입 정렬, 퀵 정렬, 병합 정렬, 기수 정렬 등) 중 가장 기본적인 알고리즘입니다. 버블 정렬 알고리즘은 아래와 같습니다. 첫 번째 요소가 두 번째 요소보다 크면, 두 요소의 위치를 바꿉니다. (swap) 두 번째 요소와 세 번째 요소보다 크면, 두 요소의 위치를 바꿉니다. (swap) 1, 2를 마지막까지 반복합니다. (마지막에서 두 번째 요소와 마지막 요소를 비교) 1~3의 과정을 한 번 거치게 되면, 가장 큰 요소가 배열의 마지막으로 밀려납니다. 1~3의 과정을 첫 요소부터 다시 반복합니다. 5를 통해 두 번째로 큰 요소가 배열의 마지막 바로 두 번째로 밀려납니다..
문제 두 개의 배열(base, sample)을 입력받아 sample이 base의 부분집합인지 여부를 리턴해야 합니다. 입력 인자 1 : base number 타입을 요소로 갖는 임의의 배열 base.length는 100 이하 인자 2 : sample number 타입을 요소로 갖는 임의의 배열 sample.length는 100 이하 출력 boolean 타입을 리턴해야 합니다. 주의사항 base, sample 내에 중복되는 요소는 없다고 가정합니다. 입출력예시 더보기 //입출력예시 let base = [1, 2, 3, 4, 5]; let sample = [1, 3]; let output = isSubsetOf(base, sample); console.log(output); // --> true sample..
문자열을 입력받아 연속되는 문자가 있을 경우, 연속 구간을 반복되는 수와 문자로 조합한 형태로 압축한 문자열을 리턴해야 합니다. 주의사항 빈 문자열을 입력받은 경우, 빈 문자열을 리턴해야 합니다. 3개 이상 연속되는 문자만 압축합니다. 입출력예시 더보기 //입출력예시 let output = compressString('abc'); console.log(output); // --> abc output = compressString('wwwggoppopppp'); console.log(output); // --> 3wggoppo4p 👻 function compressString(str) { // TODO: 여기에 코드를 작성합니다. if (str.length === 0) return "" let text =..
암호화된 문자열과 암호화 키를 입력받아 복호화된 문자열을 리턴해야 합니다. 카이사르 암호(Caesar cipher)는 평문(plaintext)을 암호키 secret개만큼 (오른쪽으로) 평행이동시켜 암호화 합니다. 복호화는 암호화된 문자열을 원래의 평문으로 복원하는 것을 말합니다. 'hello'를 secret 3으로 암호화한 경우: 'khoor' 'codestates'를 secret 11로 암호화한 경우: 'nzopdelepd' 입출력예시 더보기 //입출력예시 let output = decryptCaesarCipher('khoor', 3); console.log(output); // --> hello output = decryptCaesarCipher('zruog', 3); console.log(outpu..