https://school.programmers.co.kr/learn/courses/30/lessons/12939

 

문제 설명

문자열 s에는 공백으로 구분된 숫자들이 저장되어 있습니다. str에 나타나는 숫자 중 최소값과 최대값을 찾아 이를 "(최소값) (최대값)"형태의 문자열을 반환하는 함수, solution을 완성하세요.
예를들어 s가 "1 2 3 4"라면 "1 4"를 리턴하고, "-1 -2 -3 -4"라면 "-4 -1"을 리턴하면 됩니다.

 

제한조건

  • s에는 둘 이상의 정수가 공백으로 구분되어 있습니다.

 

Math.min(), Math.max()는 number와 string 모두 가능하다.

// 문자열을 숫자로 바꿔서 min, max 비교
function solution(s) {
    const arr = s.split(' ').map(Number)
    
    const min = Math.min(...arr)
    const max = Math.max(...arr)
    
    return min + ' ' + max
}
// 문자열로 min, max 비교
function solution(s) {
    const arr = s.split(' ')
    
    return Math.min(...arr) + ' ' + Math.max(...arr)
}
  • var

var 변수는 재선언(중복선언)되고, 재할당(업데이트) 된다.

// 재선언
var apple = 'apple'
apple // 'apple'

var apple = 'banana'
apple // 'banana'
// 재할당
var apple = 'apple'
apple = 'banana'
    
apple // banana

 

var 변수는 전역 범위 또는 함수 범위로 지정된다. (함수 레벨 스코프)

즉, 함수 밖에서 var를 사용하여 선언된 변수는 전체 윈도우에서 사용할 수 있고, 함수 안에서 선언된 변수는 함수 내에서만 사용 가능하다.

function callName(){
    var name = 'heejae'
    
    if(name === 'heejae') {
        var name = 'leeheejae'
        var nickname = 'jae'
        
        console.log(name, nickname) // leeheejae, jae
    }
    
    console.log(name, nickname) // leeheejae, jae
}

console.log(name) // ReferenceError: name is not defined
console.log(nickname) // ReferenceError: nickname is not defined

 

문제점

코드가 많아질 경우, 같은 변수를 중복해서 사용할 수 있고, 예상치 못하게 변수가 재선언 또는 재할당 되어 많은 버그를 발생시킬 수 있다.

 

  • let

let 변수는 재할당은 가능하지만, 재선언은 불가능하다.

// 재할당
let apple = 'apple'
apple = 'banana'
    
apple // banana
// 재선언
let apple = 'apple'
let apple = 'banana'
    
apple // SyntaxError: Identifier 'apple' has already been declared

 

let 변수는 코드 블록({}, 중괄호) 내부에서만 유효하다. (블록 레벨 스코프)

function callName(){
    let name = 'heejae'
    
    if(name === 'heejae') {
        let name = 'leeheejae'
        let nickname = 'jae'
        
        console.log(name, nickname) // leeheejae, jae
    }
    
    console.log(name) // heejae
    console.log(nickname) // ReferenceError: nickname is not defined
}

 

  • const

const 변수는 재선언, 재할당 모두 불가능하다.

// 재선언
const apple = 'apple'
const apple = 'banana'
    
apple // SyntaxError: Identifier 'apple' has already been declared
// 재할당
const apple = 'apple'
apple = 'banana'
    
apple // TypeError: Assignment to constant variable.

 

const 변수는 let 변수와 마찬가지로, 코드 블록({}, 중괄호) 내부에서만 유효하다. (블록 레벨 스코프)

function callName(){
    const name = 'heejae'
    
    if(name === 'heejae') {
        const name = 'leeheejae'
        const nickname = 'jae'
        
        console.log(name, nickname) // leeheejae, jae
    }
    
    console.log(name) // heejae
    console.log(nickname) // ReferenceError: nickname is not defined
}

 

결론

var 변수는 사용하지 말 것

재할당이 필요할 경우 let 변수를 사용하되, 변수의 스코프를 최대한 좁게 만들기

재할당이 필요없는 상수나 객체에는 const를 사용하기

https://school.programmers.co.kr/learn/courses/30/lessons/12982

 

문제 설명

S사에서는 각 부서에 필요한 물품을 지원해 주기 위해 부서별로 물품을 구매하는데 필요한 금액을 조사했습니다. 그러나, 전체 예산이 정해져 있기 때문에 모든 부서의 물품을 구매해 줄 수는 없습니다. 그래서 최대한 많은 부서의 물품을 구매해 줄 수 있도록 하려고 합니다.

물품을 구매해 줄 때는 각 부서가 신청한 금액만큼을 모두 지원해 줘야 합니다. 예를 들어 1,000원을 신청한 부서에는 정확히 1,000원을 지원해야 하며, 1,000원보다 적은 금액을 지원해 줄 수는 없습니다.

부서별로 신청한 금액이 들어있는 배열 d와 예산 budget이 매개변수로 주어질 때, 최대 몇 개의 부서에 물품을 지원할 수 있는지 return 하도록 solution 함수를 완성해주세요.

 

제한사항

  • d는 부서별로 신청한 금액이 들어있는 배열이며, 길이(전체 부서의 개수)는 1 이상 100 이하입니다.
  • d의 각 원소는 부서별로 신청한 금액을 나타내며, 부서별 신청 금액은 1 이상 100,000 이하의 자연수입니다.
  • budget은 예산을 나타내며, 1 이상 10,000,000 이하의 자연수입니다.

 

최대로 부서에 물품을 지원해야 하기 때문에 입력값 d(부서별로 신청한 금액)를 오름차순으로 정렬한다.

낮은 금액부터 budget(예산)에서 빼야 최대로 부서에 물품을 지원할 수 있다.

function solution(d, budget) {
    let result = 0
    const money = d.sort((a, b) => a - b)
    
    for(i=0; i<money.length; i++) {
        budget = budget - money[i]
        
        if(budget >= 0) {
            result++
        }
    }
    
    return result
}

https://school.programmers.co.kr/learn/courses/30/lessons/12981

 

문제 설명

1부터 n까지 번호가 붙어있는 n명의 사람이 영어 끝말잇기를 하고 있습니다. 영어 끝말잇기는 다음과 같은 규칙으로 진행됩니다.

  1. 1번부터 번호 순서대로 한 사람씩 차례대로 단어를 말합니다.
  2. 마지막 사람이 단어를 말한 다음에는 다시 1번부터 시작합니다.
  3. 앞사람이 말한 단어의 마지막 문자로 시작하는 단어를 말해야 합니다.
  4. 이전에 등장했던 단어는 사용할 수 없습니다.
  5. 한 글자인 단어는 인정되지 않습니다.

다음은 3명이 끝말잇기를 하는 상황을 나타냅니다.

tank → kick → know → wheel → land → dream → mother → robot → tank

위 끝말잇기는 다음과 같이 진행됩니다.

  • 1번 사람이 자신의 첫 번째 차례에 tank를 말합니다.
  • 2번 사람이 자신의 첫 번째 차례에 kick을 말합니다.
  • 3번 사람이 자신의 첫 번째 차례에 know를 말합니다.
  • 1번 사람이 자신의 두 번째 차례에 wheel을 말합니다.
  • (계속 진행)

끝말잇기를 계속 진행해 나가다 보면, 3번 사람이 자신의 세 번째 차례에 말한 tank 라는 단어는 이전에 등장했던 단어이므로 탈락하게 됩니다.

사람의 수 n과 사람들이 순서대로 말한 단어 words 가 매개변수로 주어질 때, 가장 먼저 탈락하는 사람의 번호와 그 사람이 자신의 몇 번째 차례에 탈락하는지를 구해서 return 하도록 solution 함수를 완성해주세요.

 

제한사항

  • 끝말잇기에 참여하는 사람의 수 n은 2 이상 10 이하의 자연수입니다.
  • words는 끝말잇기에 사용한 단어들이 순서대로 들어있는 배열이며, 길이는 n 이상 100 이하입니다.
  • 단어의 길이는 2 이상 50 이하입니다.
  • 모든 단어는 알파벳 소문자로만 이루어져 있습니다.
  • 끝말잇기에 사용되는 단어의 뜻(의미)은 신경 쓰지 않으셔도 됩니다.
  • 정답은 [ 번호, 차례 ] 형태로 return 해주세요.
  • 만약 주어진 단어들로 탈락자가 생기지 않는다면, [0, 0]을 return 해주세요.

 

length 속성을 이용해서 문자열의 길이뿐만 아니라 특정 위치값을 찾을 수 있다.

배열의 첫번째 값과 그 다음 값을 비교해야 하기 때문에 for문을 1부터 시작한다. (i = 0, i - 1을 하게 되면 typeError: undefined이 발생한다.

function solution(n, words) {
    for(let i = 1; i < words.length; i++) {
        // 중복 단어 찾기 || 끝말잇기 단어(단어의 마지막 알파벳, 단어의 시작 알파벳)
        if(words.indexOf(words[i]) !== i || words[i-1][words[i-1].length - 1] !== words[i][0]) {
            return [(i % n) + 1, Math.trunc(i / n) + 1]
        }
    }
        
    return [0, 0]
}

https://school.programmers.co.kr/learn/courses/30/lessons/81301

 

문제 설명

네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다. 다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.

  • 1478 → "one4seveneight"
  • 234567 → "23four5six7"
  • 10203 → "1zerotwozero3"

이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.

 

제한사항

  • 1 ≤ s의 길이 ≤ 50
  • s가 "zero" 또는 "0"으로 시작하는 경우는 주어지지 않습니다.
  • return 값이 1 이상 2,000,000,000 이하의 정수가 되는 올바른 입력만 s로 주어집니다.

 

function solution(s) {
    s = s.replaceAll('zero', '0')
    s = s.replaceAll('one', '1')
    s = s.replaceAll('two', '2')
    s = s.replaceAll('three', '3')
    s = s.replaceAll('four', '4')
    s = s.replaceAll('five', '5')
    s = s.replaceAll('six', '6')
    s = s.replaceAll('seven', '7')
    s = s.replaceAll('eight', '8')
    s = s.replaceAll('nine', '9')
    
    return Number(s)
}

https://school.programmers.co.kr/learn/courses/30/lessons/68644

 

문제 설명

정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요.

 

제한사항

  • numbers의 길이는 2 이상 100 이하입니다.
  • numbers의 모든 수는 0 이상 100 이하입니다.

 

2중 for문을 사용해서 배열의 첫번째 값과 그 다음 값을 더한다.

sort() 메서드로 오름차순 정렬 후, 전개연산자와 new Set() 객체를 이용해서 배열의 중복값을 제거한다.

function solution(numbers) {
    let result = []
    
    for(i=0; i<numbers.length; i++) {
        for(j=i+1; j<numbers.length; j++) {
            result.push(numbers[i] + numbers[j])
        }
    }
    
    return [...new Set(result.sort((a, b) => a - b))]
}
  • for문 + indexOf()

중복값의 인덱스 번호를 duplication 배열에 담는다.

const arr = ['a', 'b', 'c', 'c', 'd', 'e', 'a', 'a']
const duplication = []

for(let i = 0; i < arr.length; i++) {
    if(arr.indexOf(arr[i]) !== i) {
        duplication.push(i)
    }
}

duplication // [3, 6, 7]
  • filter() + indexOf()

filter() 메서드는 주어진 함수의 테스트를 통과하는 모든 요소들을 모아 새로운 배열로 반환한다.

indexOf() 메서드는 호출한 string 객체에서 주어진 값과 일치하는 첫번째 인덱스를 반환한다.

const arr = ['a', 'b', 'c', 'c', 'd', 'e', 'a']
arr.filter((item, index) => arr.indexOf(item) !== index) // ['c', 'a']

 

  • 전개연산자 + new Set()

전개 연산자를 사용하면 배열이나 문자열 같이 반복 가능한 0개 이상의 인수 또는 요소를 확장하여, 0개 이상의 키-값 쌍으로 객체를 확장시킬 수 있다.

Set 객체는 자료형에 관계 없이 원시값(string, number, bollean, undefined, null 등..)과 객체 참조 모두 유일한 값을 저장할 수 있다.

= 중복된 값이 있으면 1개만 남긴다. (중복 혀용 X)

const arr = ['a', 'b', 'c', 'c', 'd', 'e']
[...new Set(arr)] // ['a', 'b', 'c', 'd', 'e']

 

  • Array.from() + new Set()

Array.from() 메서드는 유사 배열 객체나 반복 가능한 객체를 얕게 복사해 새로운 배열을 만든다.

const arr = ['a', 'b', 'c', 'c', 'd', 'e']
Array.from(new Set(arr)) // ['a', 'b', 'c', 'd', 'e']

 

  • filter() + indexOf()

filter() 메서드는 주어진 함수의 테스트를 통과하는 모든 요소들을 모아 새로운 배열로 반환한다.

indexOf() 메서드는 호출한 string 객체에서 주어진 값과 일치하는 첫번째 인덱스를 반환한다.

const arr = ['a', 'b', 'c', 'c', 'd', 'e']
arr.filter((item, index) => arr.indexOf(item) === index) // ['a', 'b', 'c', 'd', 'e']

프로젝트를 진행하다 보면 여러 개발 환경을 세팅해야 할 때가 있다.

그중 노드 버전을 변경해야 할 때가 있는데 NVM(Node Version Manager)을 사용하면 상황에 맞게 원하는 버전으로 노드를 설치하거나 변경할 수 있다.

 

1. nvm 설치하기

https://github.com/coreybutler/nvm-windows/releases

 

Releases · coreybutler/nvm-windows

A node.js version management utility for Windows. Ironically written in Go. - coreybutler/nvm-windows

github.com

위의 사이트에서 nvm-setup.exe 파일을 다운받아 설치한다.

터미널에서 nvm -v를 하면 설치된 버전을 확인할 수 있다.

 

2. nvm install 버전

원하는 버전의 노드를 설치한다.

nvm list 명령어로 설치된 노드 버전을 확인할 수 있고,

nvm list available 명령어로 설치 가능한 노드 버전을 확인할 수 있다.

 

3. nvm use 버전

원하는 버전의 노드로 변경한다.

 

※주의※
node를 실행 파일로 설치한 경우, nvm으로 node 버전이 안 바뀔 수 있다.
이 때는 제어판에서 node를 삭제한 후, nvm을 설정한다.

 

'기타 개념' 카테고리의 다른 글

REST, REST API, RESTful API란?  (0) 2023.06.08
웹 개발 프로세스 - 기획부터 배포까지  (0) 2023.05.22

+ Recent posts