1.파이썬, javascript에서 두개 이상의 값 입력받는 법
a, b = input('두 개를 입력하세요: ').split()
var [a, b] = prompt("두 개를 입력하세요: ").split(" ")
#공백을 기준으로 값이 구분됨
2.javascript에서 음수값 포함 정수형 소팅하기
nums.sort((a, b) => a - b);
cf. 참고로 위는 다음 코드를 함축하여 표현한 것이다. nums.sort(function compareNumbers(a, b) {
return a - b;
});
3.배열에서 가장 큰 원소 찾기 Math.max(...arr); , 특정 조건을 만족하는 값 찾기 arr.find(function 내용);
const arr = [1, 2, 3];
const max = Math.max(...arr);
const found = arr.find(element => element <3 );
console.log(max);//expected output 3
console.log(found);////expected output 1
링크
생각보다 푸는데 오래걸렸다. 파이썬으로 문제를 해결하였다.
해설: 끊어진 기타줄의 개수 N과 기타줄 브랜드 M개가 주어지고, 각각의 브랜드에서 파는 기타줄 6개가 들어있는 패키지의 가격, 낱개로 살 때의 가격이 주어질 때, 적어도 N개를 사기 위해 필요한 돈의 수를 최소로 하는 프로그램 문제이다.
ex.
Input:
4 2 ->N M 을 입력 받음 (끊어진 기타줄의 개수 N,기타줄 브랜드 M개 N<=100 M<=50)
12 3 -> a 브랜드의 패키지 가격과 낱개의 가격
15 4 -> b 브랜드의 패키지 가격과 낱개의 가격
Output:
12
문제풀이
need, brand= input().split()
set1 ,set2 = [],[]
price = 0
need = int(need)
brand = int(brand)
for i in range(0,brand):
n1, n2 = input().split()
set1.append(int(n1))
set2.append(int(n2))
#값이 저렴한 순으로 오름차순 정렬
set1.sort()
set2.sort()
#모두 살 때까지 반복
while(need>0):
#필요 기타줄이 6개 이상이고, 세트구매가 낱개씩 구매할 때 보다 더 싼 경우
if(need >= 6 and set1[0] < set2[0]*6):
need -= 6
price += set1[0]
#필요 기타줄이 6개 이하지만, 세트구매가 낱개씩 구매할 때 보다 더 싼 경우
elif(need < 6 and set1[0] < set2[0] * 6):
need -= 6
price += set1[0]
#필요 기타줄이 6개 이하이고, 낱개씩 구매하는게 더 싼 경우
else:
price += set2[0]*need
need = 0
print(price)
코드 해설은 코드내에 주석처리로 달아두었다
해설: nums의 원소 3개의 합이 0이 되는 조합들을 찾는 문제이다. 원소의 값은 같아도 되나, 같은 인덱스의 값을 더해서는 안된다.
ex. Input: nums = [-1,0,1,2,-1,-4]
Output: [[-1,-1,2],[-1,0,1]]
문제풀이
-nums 원소들을 오름차순 정렬 해준다.
-가장 작은 인덱스의 원소 + 두번째로 작은 인덱스의 원소 + 가장 큰 인덱스의 합을 시작으로, 3개의 원소의 합이 0이 되는 모든 경우의 수를 확인한다.
var threeSum = function(nums) {
nums.sort(function compareNumbers(a, b) {
return a - b;
});
const result = [];
let sum = null;
console.log(nums);
for(let i=0;i<nums.length;i++){
let low = i+1, high = nums.length-1,sum=0;
while(low < high){
sum = nums[i] + nums[low]+nums[high];
if(sum === 0){
result.push([nums[i],nums[low],nums[high]]);
while(nums[low+1]=== nums[low]) low++;
while(nums[high-1]=== nums[high]) high++;
low++;
high--;
}else if(sum <0) low++;
else high--;
}
while(nums[i+1] === nums[i])i++;
}
return result;
};
이 문제는 개념이 도저히 잡히지 않아 오랜시간을 고민해봐도 못 풀은 문제이다.
몇 주 뒤엔 이 문제도 거뜬히 풀 수 있는 상태가 되도록 노력하자.
해설: 물을 가장 많이 담았을 때의 넓이를 확인하는 문제이다.
Input: height = [1,8,6,2,5,4,8,3,7]
Output: 49
문제풀이
-(높이*너비)의 값이 가장 큰 사각형을 만드는 문제이다.
-높이는 heigth 원소 값, 높이는 선택된 두 원소의 인덱스의 차이로 확인한다.
-중요한 점은 물의 넓이가 더 작은 막대기에 의해 좌우된다는 점이다.
양 끝점을 가리치는 포인터 i와 j를 두고 더 큰 넓이를 찾아가는 알고리즘으로 문제를 풀어나가도록 한다.
var maxArea = function(height) {
let i = 0;
let j = height.length - 1;
let max = 0;
while(i < j) {
const min = Math.min(height[i], height[j]);
max = Math.max(max, min * (j - i));
if (height[i] < height[j]) {
i++;
} else {
j--;
}
}
return max;
};
<난이도 구성>
-난이도 1,2 : 구글링 안하고 직접 푼 문제
-난이도 3: 직접 풀었지만 메서드 구글링한 문제
-난이도 4,5: 직접 못 풀고 답을 참고하여 푼 문제 (꼭 다시 풀어봐야 할 문제)