input().split(), sort((a, b) => a - b);(코문풀 bj-1049번, lc-15번,11번)

run dev yun ·2021년 4월 2일
0

💻코딩문제풀이

▶학습한 내용 (Javascript)

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

🔎백준문제

#1049번 기타줄 <난이도:3>

링크
생각보다 푸는데 오래걸렸다. 파이썬으로 문제를 해결하였다.

해설: 끊어진 기타줄의 개수 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)

코드 해설은 코드내에 주석처리로 달아두었다

🔎leetcode

#15. 3Sum <난이도:5> (꼭꼭 다시 풀어볼 것!!!)텍스트

해설: 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;

};

이 문제는 개념이 도저히 잡히지 않아 오랜시간을 고민해봐도 못 풀은 문제이다.
몇 주 뒤엔 이 문제도 거뜬히 풀 수 있는 상태가 되도록 노력하자.

11. Container With Most Water <난이도:4> (꼭 다시 풀어볼 것!!!)

해설: 물을 가장 많이 담았을 때의 넓이를 확인하는 문제이다.
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: 직접 못 풀고 답을 참고하여 푼 문제 (꼭 다시 풀어봐야 할 문제)

다시 풀어볼 문제는 여기에 !

앞으로 풀어볼 문제

profile
꾸준히 꼼꼼하게 jjy306105@gmail.com

0개의 댓글