일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 프로그래머스
- 개발공부
- 날씨 웹 만들기
- [AI 5기] 연습 문제집
- 자바스크립트 sort()
- 코딩부트캠프
- 자바스크립트 reduce()
- 개발일기
- 리트코드
- 자바스크립트
- 코드스테이츠
- HTML
- 부트캠프
- 간단한 날씨 웹 만들기
- 삼항연산자
- 자바스크립트 날씨 웹 만들기
- JavaScript
- [파이썬 실습] 기초 문제
- 프론트개발공부
- reactnativecli
- [파이썬 실습] 심화 문제
- 프론트개발
- 자바스크립트 split()
- 엘리스 AI 트랙 5기
- RN 프로젝트
- leetcode
- 자바스크립트 날씨
- 엘리스 ai 트랙
- 엘리스
- [파이썬 실습] 중급 문제
- Today
- Total
개발조각
[리트코드] 1. Two Sum 본문
안녕하세요. 개발조각입니다.😊
리트코드에서 첫 문제를 풀었습니다,
일단 Easy를 어느 정도 풀어보려고 합니다.
그럼 1. Two Sum 문제 해결방안에 대해 설명하겠습니다.
https://leetcode.com/problems/two-sum/
Two Sum - LeetCode
Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.
leetcode.com
💚 번역기 돌리면
정수 숫자의 배열과 정수 목표값이 주어지면 목표값에 더해지도록 두 숫자의 인덱스를 반환합니다.
각 입력에 정확히 하나의 솔루션이 있다고 가정할 수 있으며, 동일한 요소를 두 번 사용할 수 없습니다.
답변은 임의의 순서로 반환할 수 있습니다.
후속 조치: O(n2) 시간 복잡도보다 작은 알고리즘을 생각해 낼 수 있습니까?
접근방법
O(n2) 시간 복잡도보다 작은 알고리즘을 구하라 했으니이중 for문은 안 되겠다고 생각했습니다.
(for문 시간 복잡도: O(n), 이중 for문 시간 복잡도: O(n2))
그래서 for문을 한 번만 쓰고 최대한 내장 함수로 해결해봐야겠다고 생각했습니다.
해결방안
기존 풀이 방식의 Runtime이 너무 올래 걸리는 것 같아서
다시 수정해보았습니다.
새롭게 푼 방식
var twoSum = function(nums, target) {
let [x, y] = [0, 0]
const arr = [];
while(1){
arr.push(nums.shift());
const remainder = target-arr[arr.length-1];
const requiredIdx = nums.indexOf(remainder);
if(requiredIdx > -1){
x = arr.length-1;
y = requiredIdx+arr.length;
break;
}
}
return [x, y]
};
아래와 같은 예제가 있으면
Input: nums = [2,7,11,15], target = 9
arr.push(nums.shift());
nums = [7, 11, 15], arr=[2]가 됩니다.
const remainder = target-arr[arr.length-1];
remainder = 7이 됩니다.
const requiredIdx = nums.indexOf(remainder);
indexOf를 사용하여 nums에서 remainder값이 있는지 확인합니다.
requiredIdx = 0;
if(requiredIdx > -1){
x = arr.length-1;
y = requiredIdx+arr.length;
break;
}
만약 nums에 remainder값이 있으면 x, y에 해당 값을 넣고 break 해줍니다.
기존 풀이 방식
var twoSum = function(nums, target) {
let [x, y] = [0, 0]
for(let i=0; i<nums.length; i++){
let arr = nums.slice(i+1);
let remainder = arr.indexOf(target-nums[i]);
if(remainder > -1){
x = i;
y = remainder+i+1;
break;
}
}
return [x, y]
};
아래와 같은 예제가 있으면
Input: nums = [2,7,11,15], target = 9
nums배열에서 i값의 뒤쪽에 있는 원소를 arr배열에 담아줍니다.
(slice를 사용해서 풀었습니다.)
- i가 0일 경우: arr = [7, 11, 15]
- i가 1일 경우: arr = [11, 15]
- i가 2일 경우: arr = [15]
arr배열에 target-nums[i]인 원소가 있는 위치를 remainder변수에 담아줍니다.
(indexOf를 사용해서 풀었습니다. 없을 경우 -1이 나옵니다.)
- i가 0일 경우: remainder = 0
- i가 1일 경우: remainder = -1
- i가 2일 경우: remainder = -1
만약 remainder가 -1보다 크다면(arr배열에 target-nums[i]인 원소가 있다면)
x에는 i, y에는 remainder+i+1를 넣어주고 break를 해줍니다.
'알고리즘🅰 > 리트코드' 카테고리의 다른 글
[리트코드] 6. Zigzag Conversion (0) | 2022.09.12 |
---|---|
[리트코드] 5. Longest Palindromic Substring (0) | 2022.09.12 |
[리트코드] 4. Median of Two Sorted Arrays (0) | 2022.09.11 |
[리트코드] 3. Longest Substring Without Repeating Characters (0) | 2022.09.10 |
[리트코드] 9. Palindrome Number (0) | 2022.09.09 |