์๋น ๋ต์ ๋ณด๊ธฐ (๐ Click)
ํผ๋ณด๋์น๋ฅผ ํตํ ์ฌ๊ท์ DP ๋น๊ต ์ค๋ช
N = int(input())
D = [0, 1]
for i in range(2, N + 1):
D.append(D[i-2] + D[i-1])
print(D[N])
EASY
, ํ์ดํธ๋ณด๋ ๋ฉด์
๋ฐฐ์ด nums์ [0, n]๋ฒ์์ n๊ฐ์ ์์ ์ ์๊ฐ ๋ด๊ฒจ์์ต๋๋ค. [0, n]๋ฒ์ ์ ์ค์์ ๋ฐฐ์ด์ ๋น ์ ธ์๋ ์ ํ๋๋ฅผ ๋ฐํํ๋ ๊ฐ์ฅ ํจ์จ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ ์์ฑํ์ธ์.
์๋น ๋ต์ ๋ณด๊ธฐ (๐ Click)
- ์๊ณ ๋ฆฌ์ฆ ์๊ฐ
- HashSet์ ์ฃผ์ด์ง ๋ฐฐ์ด์ ๊ฐ์ ๋ฃ์ต๋๋ค.
- ๋ค์ ์ฃผ์ด์ง ๋ฐฐ์ด์ ํ์ํ๋ฉฐ HashSet์ ๊ฐ์ด ์๋์ง ์ฐพ์ต๋๋ค.
- Set์ O(1)์ผ๋ก ์ฐพ๊ธฐ์
.contatins
์ ์๊ฐ๋ณต์ก๋๋ O(1)์ ๋๋ค.
- ์๊ณ ๋ฆฌ์ฆ ๋ถ์
- ์๊ฐ๋ณต์ก๋: O(n)
- ๊ณต๊ฐ๋ณต์ก๋: O(n)
class Solution {
public int missingNumber(int[] nums) {
Set<Integer> numSet = new HashSet<Integer>();
for (int num : nums) {
numSet.add(num);
}
int expectedNumCount = nums.length + 1;
for (int number = 0; number < expectedNumCount; number++) {
if (!numSet.contains(number)) {
return number;
}
}
return -1;
}
}
- ์๊ณ ๋ฆฌ์ฆ ์๊ฐ
- ๊ฐ์ ์ซ์๋ฅผ O(1)์ ์ง์๋ฒ๋ฆฌ๋ ๊ฐ๋ ฅํ ๋นํธ ์ฐ์ฐ์ด ์์ต๋๋ค.
- XOR์ฐ์ฐ์ ๊ฐ์ ์์ด๋ฉด 0์ผ๋ก ๋ฐ๊ฟ๋๋ค.
- ๋ฐฐ์ด์ ์ํํ๋ฉด์ idx์ ๋ฐฐ์ด์ ๊ฐ๊ณผ XOR์ฐ์ฐ์ ์ํํฉ๋๋ค.
- ๊ฐ์ ์๋ 0์ผ๋ก ๋๋ฏ๋ก ์ต์ข ์ ์ผ๋ก ๋ฐฐ์ด์ ๊ฐ์ ๋๋ฝ๋ ์๋ฅผ ์ป์ ์ ์์ต๋๋ค.
Index 0 1 2 3
Value 0 1 3 4
missing = 4^(0^0)^(1^1)^(2^3)^(3^4)
= (4^4)^(0^0)^(1^1)^(3^3)^2 # ๊ตํ๋ฐฅ์น์ผ๋ก ๊ฐ์ ์๋ผ๋ฆฌ ๋ฌถ์ด์ค๋ค.
= 0^0^0^0^2 # ๊ฐ์ ์ ๋ผ๋ฆฌ ๋ฌถ์ผ๋ฉด ๋ฐฐ์ด์ ๋น ์ง ์ซ์๊ฐ ๋์ค๊ฒ๋๋ค.
= 2
- ์๊ณ ๋ฆฌ์ฆ ๋ถ์
- ์๊ฐ๋ณต์ก๋: O(n)
- ๊ณต๊ฐ๋ณต์ก๋: O(1)
class Solution {
public int missingNumber(int[] nums) {
int missing = nums.length;
for (int i = 0; i < nums.length; i++) {
missing ^= i ^ nums[i];
}
return missing;
}
}
- ์ฐ์๋ ์์์ ์์ ํฉ์ ๊ตฌํ๋ ๊ณต์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
โโni=โn(n+1)/2
์ฐ์๋ ์ - ํ์ฌ ๋ฐฐ์ด์ ์
๋ฅผ ๋นผ๋ฉด ๋ฐฐ์ด์ ๋๋ฝ๋ ํ ๊ฐ์ ์๋ฅผ ๊ตฌํ ์ ์์ต๋๋ค.- ์๊ฐ๋ณต์ก๋: O(n)
- ๊ณต๊ฐ๋ณต์ก๋: O(1)
class Solution {
public int missingNumber(int[] nums) {
int expectedSum = nums.length * (nums.length + 1) / 2;
int actualSum = 0;
for (int num : nums) {
actualSum += num;
}
return expectedSum - actualSum;
}
}
EASY
, ํ์ดํธ๋ณด๋ ๋ฉด์
, Joyful Pythonic
์ ๋ ฅ ์ถ๋ ฅ ๊ฐ ํ์ธ (๐ Click)
1 <= nums.length <= 100, 0 <= nums[i] <= 109
์
๋ ฅ: nums = [10,2]
์ถ๋ ฅ: "210"
์
๋ ฅ: nums = [3,30,34,5,9]
์ถ๋ ฅ: "9534330"
์๋น ๋ต์ ๋ณด๊ธฐ (๐ Click)
๋ณธ ๋ฌธ์ ๋ ์ ํ์ ์ธ ์ ๋ ฌ๋ฌธ์ ๋ฅผ ์ด์ง ๋นํ์ด์ ์๋ก์ด ์ ๋ ฌ ๊ธฐ์ค์ ์ฃผ์์ต๋๋ค. ์ฌ๊ธฐ์ ํ์ ์ฃผ์ด์ผํ ๊ฒ์ '์๋ก์ด ์ ๋ ฌ ๊ธฐ์ค' ์ ๋๋ค. ๊ทธ๋ ๊ธฐ์ ๋ด์ฅํจ์์ ์ค๋ฆ์ฐจ์, ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ์ด ์๋ Custom Sort ์ฆ ์๋ก์ด ์ ๋ ฌ ๊ธฐ์ค์ ๊ตฌํํด์ผํฉ๋๋ค.
๋ฌธ์ ๋ฅผ ํธ๋ ๋ฐฉ๋ฒ์ ๊ฐ์ ๋น๊ตํ๊ณ ์กฐ๊ฑด์ ๋ง์ถ์ด swap์ ํ๋ ๋ฐฉ์์ด ์๊ฒ ์ง๋ง ์ ๋ ฌ ๋ฌธ์ ๋ต๊ฒ python์ sort ํจ์๋ฅผ ์ด์ฉํ์ฌ ํ์ด๋ณด๊ฒ ์ต๋๋ค.
- ์๊ณ ๋ฆฌ์ฆ ๋ถ์
- ์๊ฐ๋ณต์ก๋:
O(nlgn)
- ์ ๋ ฌํ๋๋ฐ ์์๋๋ ์๊ฐ๋ณต์ก๋. - ๊ณต๊ฐ๋ณต์ก๋:
O(n)
- ์๊ฐ๋ณต์ก๋:
class Solution(object):
def largestNumber(self, nums):
def numOrder(x, y):
left = int(x + y)
right = int(y + x)
return left - right
if len(nums) == 0: return ""
numsStr = [str(n) for n in nums]
numsStr.sort(reverse=True, cmp=numOrder)
if numsStr[0] == '0': return "0"
else: return "".join(numsStr)
๊ธด์ฅํ ์ํ + ๋ฉด์ ์ด๋ผ๋ ์๋ฐ์ ์๋ฆฌ์์ ์ฝ๊ฒ ๋์ฌ ์ ์์ผ๋ฉฐ ํ์ด์ฌ์ผ๋ก ๊ตฌํํ ์ ์๋ ๊ฐ์ฅ ๋ํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํํด๋ณด์์ต๋๋ค. ๋ง์ฝ ์ฌ๋ฌ๋ถ๋ค์ด ๋ฉด์ ๊ด ์์์ ์ด๋ ๊ฒ ๊ตฌํ์ ํ๋ค๋ฉด ๋ฉด์ ๊ด์ ์ญ?
ํ๊ณ ์ฌ๋ฌ๋ถ์ ์ด๋ ฅ์๋ฅผ ๋ค์ ์ดํด๋ณผ ๊ฒ์
๋๋ค.
๋ณธ ์ฝ๋๊ฐ ์ธ๋ จ๋์ง ๋ชปํ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- sort์ ์ฌ์ฉ๋
cmp
๋งค๊ฐ๋ณ์๋ python3.0 ์ดํ๋ก ์ง์ํ์ง ์์ต๋๋ค. ์ฐธ๊ณ Python Doc - ํจ์์์์ int, ํจ์ ๋ฐ์์ strํ์ผ๋ก ๋ฐ์ดํฐ ํ์ด ํผ๋์ค๋ฝ์ต๋๋ค.
- if๊ฐ ๋ถํ์ํ๊ฒ ๋จ๋ฐ๋๊ณ ์์ต๋๋ค.
์ด ํ์ด๋ฅผ pythonicํ ํ์ด๋ก ๋ฐ๊พธ์ด๋ณด๊ฒ ์ต๋๋ค.
class Solution:
def largestNumber(self, nums):
class Predicate(str):
def __lt__(self, other):
return self + other < other + self
res = ''.join(sorted(map(str, nums), key=Predicate, reverse=True))
return '0' if res[0] == '0' else res
key๋ฅผ ์ด์ฉํ๋ ๊ฒ์ ๋ฐฑ์ค ๋ฌธ์ ๋ฅผ ์ข ํ์ด๋ดค๋ค๋ฉด ๋ฏ์ค์ง ์์ ๊ฒ์ ๋๋ค.
>>> tuple_list = [('Covenant', 9),
('Covenant', 1)]
>>> tuple_list.sort(key=lambda x : (x[0], x[1]))
>>> print(tuple_list)
[('Covenant', 1), ('Covenant', 9)]
์ ๋ ฌ ์กฐ๊ฑด์ผ๋ก ์ฌ๋ฌ ์์๋ฅผ ๊ฐ๋ ๊ฒฝ์ฐ ํํ๋ก ์ฌ์ฉํด์ ์๋ก์ด ์ ๋ ฌ ์กฐ๊ฑด์ ์ค๋ ์ฌ์ฉํ์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ฌ๊ธฐ์ Predicate class์ __lt__
(less than)๋ผ๋ ๋งค์ง ๋ฉ์๋๋ฅผ ์ค ๊ฒ์
๋๋ค.
a = ["10", "5"] ์ผ๋ Predicate
์ __lt__
์ ์ ์๋ ๊ฐ์ผ๋ก ๊ณ์ฐํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ ๋ ฌ ๋ ๊ฒ์
๋๋ค.
a[0] + a[1] = "105"
a[1] + a[0] = "510"
105๋ณด๋ค ํฐ 510์ด ๋ต์ผ๋ก ๋ฐํ ๋ ๊ฒ์ ๋๋ค.
์ ํ ์๊ณ ๋ฆฌ์ฆ
, ๊ผฌ๋ฆฌ๋ฌผ๊ธฐ ์ต์ ํ
์๋น ๋ต์ ๋ณด๊ธฐ (๐ Click)
์๊ฐ๋ณต์ก๋: O(n), ๊ณต๊ฐ ๋ณต์ก๋: O(1)
import sys
def find_largest_number_in_array(A):
ans = -sys.maxsize
for number in A:
if number > ans:
ans = number
return ans
์๊ฐ๋ณต์ก๋: O(n), ๊ณต๊ฐ ๋ณต์ก๋: O(1)
def find_small_and_largest_number_in_array(A):
_max, _min = -sys.maxsize, sys.maxsize
for number in A:
if number > _max:
_max = number
elif number < _min:
_min = number
return _max, _min
์๊ฐ๋ณต์ก๋: O(n), ๊ณต๊ฐ ๋ณต์ก๋: O(1)
def optimization_find_small_and_largest_number_in_array(A):
_max = _min= A[0]
for idx in range(0, len(A), 2):
first = A[idx]
second = A[idx + 1]
if first < second:
if first < _min: _min = first
if second > _max: _max = second
else:
if second < _min: _min = second
if first > _max: _max = first
return _max, _min
*๋ฐฐ์ด์ ๊ฐฏ์๊ฐ ํ์์ธ ๊ฒฝ์ฐ index out of range exception์ด ๋ฐ์ํ๋ฏ๋ก Padding ๊ฐ์ ํ๋ ์ถ๊ฐํ๋ฉด ๋ฉ๋๋ค.
์์ ํ์
, ๊ผฌ๋ฆฌ๋ฌผ๊ธฐ ์ต์ ํ
์๋น ๋ต์ ๋ณด๊ธฐ (๐ Click)
์๊ฐ๋ณต์ก๋: O(n^2) ๊ณต๊ฐ๋ณต์ก๋: O(1)
def bruteforce(A):
for i in range(len(A)):
for j in range(i + 1, len(A)):
if A[i] == A[j]:
print("Duplicates exist: " + str(A[i]))
return
print("No duplicates in given array")
ํ์ด 1์ ์ต์ ํ. ์ ๋ ฌ์ ํ๋ฉด ๋ฐ๋ก ์์ ์์์ ๋น๊ตํ๋ฉด ๋๊ธฐ์ ํ์ ์๊ฐ์ ์ค์ผ ์ ์์ต๋๋ค.
์๊ฐ๋ณต์ก๋: O(nlogn) ๊ณต๊ฐ๋ณต์ก๋: O(1)
def sorting(A):
A.sort()
for i in range(len(A)-1):
if A[i] == A[i+1]:
print("Duplicates exist: " + str(A[i]))
return
print("No duplicates in given array")
set()
์ ์ ์ฅํ๋ฉด ์๋ฅผ ๋ฃ๊ธฐ ์ ์ set()
์ ๊ฐ์ด ์๋์ง ๊ฒ์ฌํ ๋์ ์๊ฐ ๋ณต์ก๋๋ O(1)์
๋๋ค. ์ ๋ ฌ๋ณด๋ค ์๊ฐ๋ณต์ก๋๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.
์๊ฐ๋ณต์ก๋: O(n) ๊ณต๊ฐ๋ณต์ก๋: O(n)
def hash(A):
tmp = set()
for i in A:
if i in tmp:
print("Duplicates exist: " + str(i))
return
tmp.add(i)
print("No duplicates in given array")
- ํ์ด 3 ํด์ฌ์์ ์ต์ ์ ๊ฒฝ์ฐ ๋ชจ๋ ์์๋ฅผ ์ ์ฅํด์ผํ๊ธฐ์ ๊ณต๊ฐ๋ณต์ก๋ n์ ๋๋ค.
- ๊ณต๊ฐ ๋ณต์ก๋๋ฅผ O(1)๋ก ์ค์ผ ์ ์๋ ์์ํ์ง๋ง ์ด๋ ต์ง ์์ ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐํ๊ฒ ์ต๋๋ค.
์๊ฐ๋ณต์ก๋: O(n) ๊ณต๊ฐ๋ณต์ก๋: O(1)
def negation(A):
for i in range(len(A)):
if A[abs(A[i])] < 0:
print("Duplicates exist", abs(A[i]))
return
A[A[i]] = -A[A[i]]
print("No duplicates in given array")
A = [3, 1, 0, 1, 4]
๋ฅผ ์์๋ก ๋ณด๊ฒ ์ต๋๋ค.- Step1.
A[abs(A[i])]
๊ฐ ์์๊ฐ ์๋๋ฏ๋กA[A[i]]
๋ฅผ ์์๋ก ๋ฐ๊ฟ๋๋ค. - Step2.
A[abs(A[i])]
๊ฐ ์์๊ฐ ์๋๋ฏ๋กA[A[i]]
๋ฅผ ์์๋ก ๋ฐ๊ฟ๋๋ค. - Step3.
A[abs(A[i])]
๊ฐ ์์๊ฐ ์๋๋ฏ๋กA[A[i]]
๋ฅผ ์์๋ก ๋ฐ๊ฟ๋๋ค. - Step4.
A[abs(A[i])]
๊ฐ ์์์ด๋ฏ๋ก ์ค๋ณต ์์๊ฐ ๋ฐฐ์ด์ ์กด์ฌํฉ๋๋ค.
์ด ๋ฐฉ๋ฒ์ 0 ~ n-1 ๋ฒ์์ผ ๊ฒฝ์ฐ์๋ง ๊ฐ๋ฅํฉ๋๋ค. n ์ด์์ ์ซ์๊ฐ ๋ฐฐ์ด์ ์์ ๊ฒฝ์ฐ Out of range ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค.
์์ ํ์
, ๊ผฌ๋ฆฌ๋ฌผ๊ธฐ ์ต์ ํ
์๋น ๋ต์ ๋ณด๊ธฐ (๐ Click)
์๋ก ๋ค๋ฅธ [1, n]๋ฒ์์ n-1๊ฐ์ ์ซ์๊ฐ ๋ค์ด์๋ ๋ฆฌ์คํธ๊ฐ ์ฃผ์ด์ง๋๋ค. ์ฃผ์ด์ง ๋ฐฐ์ด์ ๋น ์ง ์๋ฅผ ์ฐพ์ผ์ธ์.
- ์ ์ฌ ๋ฌธ์ : LeetCode. Missing Number, ๋ฐฑ์ค 1920. ์ ์ฐพ๊ธฐ
๋ณธ ๋ฌธ์ ์ ๋ํ ์์ธ ํด์ค์ covenant.tistory.com/245์์ ๋ณผ ์ ์์ต๋๋ค.
์๊ฐ๋ณต์ก๋: O(n^2) ๊ณต๊ฐ๋ณต์ก๋: O(1)
def find_missing_number_bruteforce(A):
N = len(A)
for cur in range(1, N+1):
flag = False
for a in A:
if cur == a:
flag = True; break
if flag is False:
print("Missing number is " + str(cur))
break
์๊ฐ๋ณต์ก๋: O(nlogn) ๊ณต๊ฐ๋ณต์ก๋: O(1)
def find_missing_number_sort(A):
A.sort()
for cur in range(1, len(A)+1):
if cur not in A:
print("Missing number is " + str(cur))
break
์๊ฐ๋ณต์ก๋: O(n) ๊ณต๊ฐ๋ณต์ก๋: O(n)
def find_missing_number_hashing(A):
A = set(A)
for cur in range(1, len(A)+1):
if cur not in A:
print("Missing number is " + str(cur))
break
์๊ฐ๋ณต์ก๋: O(n) ๊ณต๊ฐ๋ณต์ก๋: O(1)
def find_missing_number_summation_formula(A):
N = len(A)
total_sum = (N + 1) * (N + 2) // 2
curr_sum = sum(A)
if total_sum - curr_sum != 0:
print("Missing number is " + str(abs(total_sum - curr_sum)))
์๊ฐ๋ณต์ก๋: O(n) ๊ณต๊ฐ๋ณต์ก๋: O(1)
def find_missing_number_xor(A):
N = len(A)
X1 = A[0]
X2 = 0
for i in range(1, N):
X1 = X1 ^ A[i]
for cur in range(1, N+2):
X2 = X2 ^ cur
print("Missing number is " + str(X1 ^ X2))
๋ต์ ์ค๋น์ค์ ๋๋ค.
pivotal(๋๊ฐ์ ์ด ๊ณ ์ ์ธ ํ๋ ฌ) 3x3, 4x4๋ฅผ ๋ค์ง๋ ๋ก์ง์ ์ง๋ณด์ธ์ ์ฌ๊ท๋ฅผ ์จ์ผํจ.
๋ต์ ์ค๋น์ค์ ๋๋ค.