문제 설명

함수 solution은 정수 x와 자연수 n을 입력 받아, x부터 시작해 x씩 증가하는 숫자를 n개 지니는 리스트를 리턴해야 합니다. 다음 제한 조건을 보고, 조건을 만족하는 함수, solution을 완성해주세요.

제한 조건

  • x는 -10000000 이상, 10000000 이하인 정수입니다.
  • n은 1000 이하인 자연수입니다.

입출력 예

 


내 풀이

function solution(x, n) {
    const answer = [0];
    
    for(let i = 1 ; i <= n ; i++ ){
        answer[i] = answer[i-1] + x;
    }
    
    answer.shift();

    return answer;
}
728x90

Set Object in JS

Set은 Javascript 표준 내장 객체로, 원시값(primitive)과 객체 참조 모두 유일한 값을 저장할 수 있다.

Array와 다르게 중복된 값을 허용하지 않는다.

 

const set = new Set();

console.log(typeof set); // object
console.log(set); // Set(0){ size : 0 }

 

Set의 type은 object이며, Set의 내장 메서드는 아래와 같다.

  1. Set.prototype.add() : set에 값 추가한다.
  2. Set.prototype.clear() : set을 비워준다.
  3. Set.prototype.delet() : set에서 특정 값을 삭제한다.
  4. Set.prototype.entries() 
  5. Set.prototype.forEach()
  6. Set.prototype.has()
  7. Set.prototype.keys()
  8. Set.prototype.values()

Set.prototype.add(value) : Set 값 추가하기

const set = new Set();
set.add(1);
set.add('string');
set.add(['a','r','r','a','y']);
set.add({ "0" : "object" });

console.log(set); // Set(4) { 1, 'string', Array(5), {...} }

set에는 객체(object), 배열(array), 숫자(number), 문자열(string)등 다양한 값을 추가할 수 있다.

 

Set.prototype.clear() : Set 비워주기

const set = new Set();
set.add(1);
set.add(2);

console.log(set); // Set(2) { 1, 2 }

set.clear();
console.log(set); // Set(0) {size : 0}

 

Set.prototype.delete(value) : Set  특정 값 삭제하기

return false or true ( 삭제 성공 시 true, 삭제 실패 시 false )

const set = new Set();
set.add(1);
set.add('string');
set.add(['a','r','r','a','y']);
set.add({ "0" : "object" });

console.log(set); // Set(4) { 1, 'string', Array(5), {...} }

set.delete("string"); // true
set.delete("string"); // false

console.log(set); // Set(3) { 1, Array(5), {...} }

 

Set.prototype.entries() : Set 순회하기

entries() method는 Set 객체의 각각의 요소를 삽입순서대로 [ 값, 값 ]의 형태로 가진 배열의 새로운 iterator 객체를 반환한다.

Set 객체에는 Map 객체처럼 Key가 존재하지 않는다. 그러나 Map 객체의 API와 비슷하게 유지하기 위해, 각각의 "요소"는 "키"와 "값"자리에 같은 값을 가지게 된다. 결과적으로 entries는 [ 값, 값 ] 형태의 배열을 반환한다. 

 

const set = new Set();

set.add(1);
set.add(2);
set.add(3);

const iterator = set.entries();

console.log(iterator);
// output : SetIterator {1 => 1, 2 => 2, 3 => 3}

for(const entry of iterator ){
	console.log(entry);
}

// output 
// [1, 1]
// [2, 2]
// [3, 3]

console.log(iterator); // SetIterator {}
// output : undefined

for .. of .. 문법으로 entries() 함수로 반환된 iterator를 순회하면서 console.log()로 찍어본 결과 [ 값, 값 ] 의 형태로 set에 추가했던 1, 2, 3이 순서대로 나오는 것을 확인할 수 있다. 

이후 iterator를 다시 console.log()로 확인해보면 해당 iterator가 비어있는 것을 확인할 수 있다.

이것은 iteration protocols 를 확인해보면 더 자세히 알 수 있다.

쉽게 생각하면 iterator는 한번 가리켰던 value는 다음 value를 가리키게 되는 순간 다시 바라볼 수 없다. 즉 한번 순회하면 다시 반복할 수 없는 것이다.

 

 iterator에 우리가 set에 값을 넣은 순서대로 [1,1], [2,2], [3,3]이 들어있다. 처음에 iterator는 [1,1]을 가리키고있다. 다음에 [2,2]를 가리키게 되면 iterator에서 [1,1]은 사라지고 [2,2], [3,3]만 남아있다. 

아래 코드를 통해서 확인할 수 있다.

const set = new Set();
set.add(1);
set.add(2);
set.add(3);

for(const entry of iterator){
    console.log(entry);
    console.log(iterator);
}

// output
// [1,1]
// SetIterator {2 => 2, 3 => 3}

// [2,2]
// SetIterator {3 => 3}

// [3,3]
// SetIterator {}

 

Set.prototype.forEach(callbackFunction) : Set 반복하기

set의 forEach method는 Array의 forEach method와 동일하다.

set의 value들을 순차적으로 한번씩 순회한다. forEach대신 위에서 사용했던 for..of를 사용해서도 set을 반복할 수 있다.

const set = new Set();

set.add(1);
set.add(2);
set.add(3);

set.forEach((s)=>{
	console.log(s);
});

// output : 
// 1
// 2
// 3

for(const entry of set){
    console.log(entry);
}

// output : 
// 1
// 2
// 3

 

Set.prototype.has(value) : Set에 특정 value 존재 여부 확인하기

Set 객체에 특정 value가 존재하는지 확인하기 위한 함수이다. 특정 value가 존재한다면 true, 존재하지 않는다면 false를 반환한다.

const set = new Set();
set.add(1);
set.add(2);
set.add(3);

console.log(set.has(1)); // true
console.log(set.has(4)); // false

 

Set.prototype.values() : Set의 value iterator 반환한다. 

Set 객체의 value들에 대한 iterator를 반환한다.

const set = new Set();
set.add(1);
set.add(2);
set.add(3);

let valueIterator = set.values();

console.log(valueIterator); // SetIterator {1, 2, 3}

for(const entry of valueIterator){
	console.log(entry);
}

// output
// 1
// 2
// 3

valueIterator = set.values();

console.log(valueIterator.next()); // {value: 1, done: false}
console.log(valueIterator.next()); // {value: 2, done: false}
console.log(valueIterator.next()); // {value: 3, done: false}
console.log(valueIterator.next()); // {value: undefined, done: true}

next()는 iterator의 method이다. 참고

 

Set.prototype.keys() : Set의 key iterator 반환한다. 

❗️Set object에서는 keys() 메서드와 values() 메서드는 동일한 기능을 한다. 왜냐하면 Set 객체의 경우 value 값을 키값으로 사용하기 때문에 [ key, value ] 쌍의 값으 [ value, value]와 동일하기 때문이다.

const set = new Set();
set.add(1);
set.add(2);
set.add(3);

console.log(set.keys());
// output : SetIterator {1, 2, 3, 'string'}
728x90

문제 설명

오래전 유행했던 콜라 문제가 있습니다. 콜라 문제의 지문은 다음과 같습니다.

정답은 아무에게도 말하지 마세요.

콜라 빈 병 2개를 가져다주면 콜라 1병을 주는 마트가 있다. 빈 병 20개를 가져다주면 몇 병을 받을 수 있는가?

단, 보유 중인 빈 병이 2개 미만이면, 콜라를 받을 수 없다.

문제를 풀던 상빈이는 콜라 문제의 완벽한 해답을 찾았습니다. 상빈이가 푼 방법은 아래 그림과 같습니다. 우선 콜라 빈 병 20병을 가져가서 10병을 받습니다. 받은 10병을 모두 마신 뒤, 가져가서 5병을 받습니다. 5병 중 4병을 모두 마신 뒤 가져가서 2병을 받고, 또 2병을 모두 마신 뒤 가져가서 1병을 받습니다. 받은 1병과 5병을 받았을 때 남은 1병을 모두 마신 뒤 가져가면 1병을 또 받을 수 있습니다. 이 경우 상빈이는 총 10 + 5 + 2 + 1 + 1 = 19병의 콜라를 받을 수 있습니다.

문제를 열심히 풀던 상빈이는 일반화된 콜라 문제를 생각했습니다. 이 문제는 빈 병 a개를 가져다주면 콜라 b병을 주는 마트가 있을 때, 빈 병 n개를 가져다주면 몇 병을 받을 수 있는지 계산하는 문제입니다. 기존 콜라 문제와 마찬가지로, 보유 중인 빈 병이 a개 미만이면, 추가적으로 빈 병을 받을 순 없습니다. 상빈이는 열심히 고심했지만, 일반화된 콜라 문제의 답을 찾을 수 없었습니다. 상빈이를 도와, 일반화된 콜라 문제를 해결하는 프로그램을 만들어 주세요.

콜라를 받기 위해 마트에 주어야 하는 병 수 a, 빈 병 a개를 가져다 주면 마트가 주는 콜라 병 수 b, 상빈이가 가지고 있는 빈 병의 개수 n이 매개변수로 주어집니다. 상빈이가 받을 수 있는 콜라의 병 수를 return 하도록 solution 함수를 작성해주세요.


제한사항

  • 1 ≤ b < a  n ≤ 1,000,000
  • 정답은 항상 int 범위를 넘지 않게 주어집니다.

입출력 예

입출력 예 설명

입출력 예 #1

  • 본문에서 설명한 예시입니다.

입출력 예 #2

  • 빈 병 20개 중 18개를 마트에 가져가서, 6병의 콜라를 받습니다. 이때 상빈이가 가지고 있는 콜라 병의 수는 8(20 – 18 + 6 = 8)개 입니다.
  • 빈 병 8개 중 6개를 마트에 가져가서, 2병의 콜라를 받습니다. 이때 상빈이가 가지고 있는 콜라 병의 수는 4(8 – 6 + 2 = 4)개 입니다.
  • 빈 병 4 개중 3개를 마트에 가져가서, 1병의 콜라를 받습니다. 이때 상빈이가 가지고 있는 콜라 병의 수는 2(4 – 3 + 1 = 2)개 입니다.
  • 3번의 교환 동안 상빈이는 9(6 + 2 + 1 = 9)병의 콜라를 받았습니다.

내 코드

function solution(a, b, n) {
    var answer = 0; // 빈병으로 맞바꾼 콜라 수 
    // 소유중인 빈병 수
    let hold = n;
    while(hold >= a){
        let coka = Math.floor(hold/a) * b;
        answer += coka;
        hold = (hold % a) + coka;
    }

    return answer;
}
728x90

문제 설명

배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.

예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면

  1. array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다.
  2. 1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다.
  3. 2에서 나온 배열의 3번째 숫자는 5입니다.

배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때, commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한사항
  • array의 길이는 1 이상 100 이하입니다.
  • array의 각 원소는 1 이상 100 이하입니다.
  • commands의 길이는 1 이상 50 이하입니다.
  • commands의 각 원소는 길이가 3입니다.
입출력 예

입출력 예 설명

[1, 5, 2, 6, 3, 7, 4]를 2번째부터 5번째까지 자른 후 정렬합니다. [2, 3, 5, 6]의 세 번째 숫자는 5입니다.
[1, 5, 2, 6, 3, 7, 4]를 4번째부터 4번째까지 자른 후 정렬합니다. [6]의 첫 번째 숫자는 6입니다.
[1, 5, 2, 6, 3, 7, 4]를 1번째부터 7번째까지 자릅니다. [1, 2, 3, 4, 5, 6, 7]의 세 번째 숫자는 3입니다.

 


내 코드

function solution(array, commands) {
    const answer = [];
    for(let idx = 0 ; idx < commands.length ; idx++){
        let temp = array;
        let i = commands[idx][0];
        let j = commands[idx][1];
        let k = commands[idx][2];

        temp = temp.slice(i-1,j);
        temp.sort(function(a,b){
            return a-b;
        });    
        
        answer.push(temp[k-1]);
    }
    
    return answer;
}
728x90

+ Recent posts