[알고리즘] 문제 모음

2022. 11. 2. 17:22·개발/알고리즘
728x90
반응형

1. FrequencyCounter

문제

두개의 정수가 주어진다. 두 수가 같은 숫자를 포함하고 있는지 확인하는 함수

조건 : 시간복잡도 O(n)

예시 : 

console.log(sameFrequency(182, 281)); // true
console.log(sameFrequency(34, 14)); // false
console.log(sameFrequency(3589578, 5879385)); // true
console.log(sameFrequency(22, 222)); // false

 

풀이

function sameFrequency(num1, num2) {
  const obj1 = {};
  num1 = num1.toString();
  for (let i = 0; i < num1.length; i++) {
    obj1[num1[i]] ? (obj1[num1[i]] += 1) : (obj1[num1[i]] = 1);
  }
  num2 = num2.toString();
  for (let j = 0; j < num2.length; j++) {
    if (obj1[num2[j]]) {
      obj1[num2[j]] -= 1;
    } else {
      return false;
    }
  }
  return true;
}

2. FequencyCounter

문제

주어진 값들에 중복된 값이 있는지 판별하는 함수 만들기

조건 : 시간복잡도O(n)

예시

console.log(areThereDuplicates(1, 2, 3)); // false
console.log(areThereDuplicates(1, 2, 2)); // true
console.log(areThereDuplicates("a", "b", "c", "a")); // true

풀이

(1) 객체로 풀기

function areThereDuplicates(...arg) {
  const obj = {};
  for (let i = 0; i < arg.length; i++) {
    if (obj[arg[i]]) {
      return true;
    } else {
      obj[arg[i]] = 1;
    }
  }
  return false;
}

(2) 다중 포인터

function areThereDuplicates(...arg) {
  let i = 0;
  let j = 1;
  arg = arg.sort((a, b) => a > b);
  while (j < arg.length) {
    if (arg[i] === arg[j]) {
      return true;
    } else {
      i++;
      j++;
    }
  }
  return false;
}

(3) new Set

function areThereDuplicates() {
  return new Set(arguments).size !== arguments.length;
}

3. MultiplePointers

문제 

배열과, 평균값이 주어진다.

주어진 배열안의 연속된 두수를 더한 평균값이 있는지 확인하는 함수

조건 : 시간복잡도 O(n), 공간복잡도 : O(1)

예시

console.log(averagePair([1, 2, 3], 2.5)); // true
console.log(averagePair([1, 3, 3, 5, 6, 7, 10, 12, 19], 8)); // true
console.log(averagePair([-1, 0, 3, 4, 5, 6], 4.1)); // false
console.log(averagePair([], 4)); // false

풀이

function averagePair(arr, avg) {
  let start = 0;
  let next = arr.length - 1;
  if (next <= 0) return false;

  while (start !== next) {
    if ((arr[start] + arr[next]) / 2 === avg) {
      return true;
    } else if ((arr[start] + arr[next]) / 2 > avg) {
      next -= 1;
    } else {
      start += 1;
    }
  }
  return false;
}

 

4. isSubsequence

문제

2개의 문자열이 주어진다. 첫번째문자열이 2번째 문자열안에 포함되어있는지 확인하는 함수

첫번째 문자열안에 다른 문자열이 들어올수 있지만 순서가 바뀌면 안된다.

조건 : 시간복잡도 O(n), 공간복잡도 O(1)

예시

console.log(isSubsequence("hello", "hello world")); // true
console.log(isSubsequence("sing", "sting")); // true
console.log(isSubsequence("abc", "abracadabra")); // true
console.log(isSubsequence("abc", "acb")); // false (order matters)

풀이

function isSubsequence(str1, str2) {
  let pointer = 0;
  //첫번째 글자 찾기
  //첫번째 다음 글자중 두번째 글자찾기
  // 반복
  for (let i = 0; i < str2.length; i++) {
    if (str1[pointer] === str2[i]) {
      // 마지막글자인경우 return true
      if (pointer === str1.length - 1) {
        return true;
      }
      pointer++;
    }
  }
  return false;
}

5. maxSubarraySum

문제

배열과 숫자가 주어진다.

배열안의 요소들중 주어진 숫자만큼 연속된 수들의 합중 가장큰 합을 찾아  return
조건 : 시간복잡도 O(n)

예시

console.log(maxSubarraySum([100, 200, 300, 400], 2)); // 700
console.log(maxSubarraySum([1, 4, 2, 10, 23, 3, 1, 0, 20], 4)); // 39
console.log(maxSubarraySum([-3, 4, 0, -2, 6, -1], 2)); // 5
console.log(maxSubarraySum([3, -2, 7, -4, 1, -1, 4, -2, 1], 2)); // 5
console.log(maxSubarraySum([2, 3], 3)); // null

풀이

function maxSubarraySum(arr, length) {
  if (arr.length < length) {
    return null;
  }
  // 초기값
  let maxSum = 0;
  let answer = 0;
  for (let i = 0; i < length; i++) {
    maxSum += arr[i];
    answer += arr[i];
  }
  // 뒤에꺼 더하고 앞에꺼 빼기
  for (let i = length; i < arr.length; i++) {
    maxSum = maxSum - arr[i - length] + arr[i];
    //값이 크면 적용
    if (maxSum > answer) answer = maxSum;
  }
  return answer;
}

6. minSubArrayLen

문제

배열과 숫자가 주어진다

배열의 요소중 연속된 x개의 합이 주어진 숫자보다 크거나 같은 경우가 있다면 x의 최솟값을 return

없다면 0

조건 : 시간복잡도 O(n)

예시

console.log(minSubArrayLen([2, 3, 1, 2, 4, 3], 7)); // 2 -> because [4,3] is the smallest subarray
console.log(minSubArrayLen([2, 1, 6, 5, 4], 9)); // 2 -> because [5,4] is the smallest subarray
console.log(minSubArrayLen([3, 1, 7, 11, 2, 9, 8, 21, 62, 33, 19], 52)); // 1 -> because [62] is greater than 52
console.log(minSubArrayLen([1, 4, 16, 22, 5, 7, 8, 9, 10], 39)); // 3
console.log(minSubArrayLen([1, 4, 16, 22, 5, 7, 8, 9, 10], 55)); // 5
console.log(minSubArrayLen([4, 3, 3, 8, 1, 2, 3], 11)); // 2
console.log(minSubArrayLen([1, 4, 16, 22, 5, 7, 8, 9, 10], 95)); // 0

풀이

function minSubArrayLen(arr, num) {
  // n개일때 num와 크기 비교
  let total = 0;
  let start = 0;
  let end = 0;
  let minlen = Infinity;
  while (start < arr.length) {
    if (total < num && end < arr.length) {
      total += arr[end];
      end++;
    } else if (total >= num) {
      minlen = Math.min(minlen, end - start);
      total -= arr[start];
      start++;
    } else {
      break;
    }
  }
  return minlen === Infinity ? 0 : minlen;
}

7. findLongestSubstring

문제

문자열이 주어진다.  문자열안에서 반복되는 글자 사이에 들어가있는 글자 중 가장 긴 갯수를 return

조건 : 시간복잡도 O(n)

예시

console.log(findLongestSubstring("")); // 0
console.log(findLongestSubstring("rithmschool")); // 7
console.log(findLongestSubstring("thisisawesome")); // 6
console.log(findLongestSubstring("thecatinthehat")); // 7
console.log(findLongestSubstring("bbbbbb")); // 1
console.log(findLongestSubstring("longestsubstring")); // 8
console.log(findLongestSubstring("thisishowwedoit")); // 6

 

풀이

function findLongestSubstring(str) {
  let obj = {};
  let num = 0;
  let start = 0;
  // 중복위치 사이 찾기
  for (let i = 0; i < str.length; i++) {
    const index = obj[str[i]];
    if (index) {
      // 중복점 설정
      start = Math.max(start, index);
    }
    // 사이 갯수가 가장 많은거 찾기
    num = Math.max(num, i - start + 1);
    obj[str[i]] = i + 1;
  }
  return num;
}
728x90
반응형

'개발 > 알고리즘' 카테고리의 다른 글

[알고리즘] 재귀함수 문제 모음  (31) 2022.11.15
[알고리즘] 재귀함수  (0) 2022.11.14
[알고리즘] 연속된 수를 더해서 가장 큰 값 찾기  (1) 2022.11.02
[알고리즘] 배열에 중복되지 않는 요소 개수 찾기  (0) 2022.11.02
[알고리즘] 다중 포인터  (0) 2022.11.02
'개발/알고리즘' 카테고리의 다른 글
  • [알고리즘] 재귀함수 문제 모음
  • [알고리즘] 재귀함수
  • [알고리즘] 연속된 수를 더해서 가장 큰 값 찾기
  • [알고리즘] 배열에 중복되지 않는 요소 개수 찾기
TeTedo.
TeTedo.
  • TeTedo.
    TeTedo 개발 일기
    TeTedo.
  • 전체
    오늘
    어제
    • 분류 전체보기 (319)
      • 개발 (274)
        • Article (4)
        • 정리 (21)
        • Spring Boot (17)
        • JPA (2)
        • JAVA (6)
        • Database (4)
        • 자료구조 (11)
        • 알고리즘 (32)
        • React (20)
        • Docker (10)
        • node.js (18)
        • Devops (11)
        • Linux (4)
        • TypeScript (3)
        • Go (10)
        • HyperLedger (4)
        • BlockChain (43)
        • html, css, js (48)
        • CS (3)
        • AWS (3)
      • 모아두고 나중에 쓰기 (3)
      • 팀프로젝트 (18)
        • SNS(키보드워리어) (9)
        • close_sea (9)
      • 개인프로젝트 (1)
        • Around Flavor (1)
        • CHAM (13)
        • ethFruitShop (5)
      • 독서 (0)
        • 스프링부트와 AWS로 혼자 구현하는 웹 서비스 (0)
  • 블로그 메뉴

    • 홈
    • 개발일기
    • CS
    • 실습
    • 코딩테스트
    • 웹
    • Go
    • node.js
    • 팀플
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    mysql
    js
    go언어
    erc20
    node
    프로그래머스
    도커
    명령어
    30일챌린지
    React
    CSS
    go
    블록체인
    ERC721
    컨테이너
    하이퍼레저
    node.js
    nodejs
    html
    30일 챌린지
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
TeTedo.
[알고리즘] 문제 모음
상단으로

티스토리툴바