본문 바로가기
코딩테스트1

[코딩 테스트] 28일차: 실전 모의고사 - 제한 시간 내 문제 풀기 2

by cogito21_js 2024. 9. 28.
반응형

제한 시간 내 문제 풀기 2

이번 글에서는 제한 시간 내에 문제를 해결하는 연습을 계속합니다. 다양한 유형의 문제를 통해 실전 감각을 익혀보세요. 아래 예제 문제들을 제한 시간 내에 풀어보세요.

문제 1: 세 수의 합 (Three Sum)

주어진 배열에서 세 수의 합이 0이 되는 모든 고유한 조합을 찾으세요.

예제

  • 입력: [-1, 0, 1, 2, -1, -4]
  • 출력: [[-1, 0, 1], [-1, -1, 2]]

JavaScript

function threeSum(nums) {
  nums.sort((a, b) => a - b);
  const result = [];

  for (let i = 0; i < nums.length - 2; i++) {
    if (i > 0 && nums[i] === nums[i - 1]) continue;

    let left = 0, right = nums.length - 1;
    while (left < right) {
      const sum = nums[i] + nums[left] + nums[right];
      if (sum === 0) {
        result.push([nums[i], nums[left], nums[right]]);
        while (left < right && nums[left] === nums[left + 1]) left++;
        while (left < right && nums[right] === nums[right - 1]) right--;
        left++;
        right--;
      } else if (sum < 0) {
        left++;
      } else {
        right--;
      }
    }
  }

  return result;
}

console.log(threeSum([-1, 0, 1, 2, -1, -4])); // [[-1, -1, 2], [-1, 0, 1]]

Python

def three_sum(nums):
    nums.sort()
    result = []

    for i in range(len(nums) - 2):
        if i > 0 and nums[i] == nums[i - 1]:
            continue

        left, right = i + 1, len(nums) - 1
        while left < right:
            s = nums[i] + nums[left] + nums[right]
            if s == 0:
                result.append([nums[i], nums[left], nums[right]])
                while left < right and nums[left] == nums[left + 1]:
                    left += 1
                while left < right and nums[right] == nums[right - 1]:
                    right -= 1
                left += 1
                right -= 1
            elif s < 0:
                left += 1
            else:
                right -= 1

    return result

print(three_sum([-1, 0, 1, 2, -1, -4])) # [[-1, -1, 2], [-1, 0, 1]]

문제 2: 주식의 최대 이익 II

주어진 배열에서 주식을 여러 번 사고팔아 얻을 수 있는 최대 이익을 계산하세요. 각 원소는 날마다의 주식 가격입니다.

예제

  • 입력: [7, 1, 5, 3, 6, 4]
  • 출력: 7 (1일에 사고 3일에 팔기, 다시 3일에 사고 5일에 팔기)

JavaScript

function maxProfit(prices) {
  let maxProfit = 0;
  for (let i = 1; i < prices.length; i++) {
    if (prices[i] > prices[i - 1]) {
      maxProfit += prices[i] - prices[i - 1];
    }
  }
  return maxProfit;
}

console.log(maxProfit([7, 1, 5, 3, 6, 4])); // 7
console.log(maxProfit([1, 2, 3, 4, 5])); // 4

Python

def max_profit(prices):
    max_profit = 0
    for i in range(1, len(prices)):
        if prices[i] > prices[i - 1]:
            max_profit += prices[i] - prices[i - 1]
    return max_profit

print(max_profit([7, 1, 5, 3, 6, 4])) # 7
print(max_profit([1, 2, 3, 4, 5])) # 4

문제 3: 문자열의 조합

주어진 문자열에서 모든 가능한 부분 문자열을 찾으세요.

예제

  • 입력: "abc"
  • 출력: ["a", "ab", "abc", "b", "bc", "c"]

JavaScript

function getSubstrings(s) {
  const substrings = [];
  for (let i = 0; i < s.length; i++) {
    for (let j = i + 1; j <= s.length; j++) {
      substrings.push(s.substring(i, j));
    }
  }
  return substrings;
}

console.log(getSubstrings("abc")); // ["a", "ab", "abc", "b", "bc", "c"]

Python

def get_substrings(s):
    substrings = []
    for i in range(len(s)):
        for j in range(i + 1, len(s) + 1):
            substrings.append(s[i:j])
    return substrings

print(get_substrings("abc")) # ["a", "ab", "abc", "b", "bc", "c"]

문제 4: 배열의 중복된 원소 제거

주어진 배열에서 중복된 원소를 제거하고, 남은 원소들을 반환하세요.

예제

  • 입력: [1, 1, 2, 3, 4, 4, 5]
  • 출력: [1, 2, 3, 4, 5]

JavaScript

function removeDuplicates(arr) {
  return [...new Set(arr)];
}

console.log(removeDuplicates([1, 1, 2, 3, 4, 4, 5])); // [1, 2, 3, 4, 5]

Python

def remove_duplicates(arr):
    return list(set(arr))

print(remove_duplicates([1, 1, 2, 3, 4, 4, 5])) # [1, 2, 3, 4, 5]

결론

이번 글에서는 제한 시간 내에 문제를 해결하는 연습을 계속했습니다. 다양한 유형의 문제를 통해 실전 감각을 익히고, 시간 관리 능력을 향상시킬 수 있습니다. 다음 글에서는 모의 면접과 코드 리뷰에 대해 더 자세히 알아보겠습니다.

다음 글에서 만나요!

반응형