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

 

문제 설명

대문자와 소문자가 섞여있는 문자열 s가 주어집니다. s에 'p'의 개수와 'y'의 개수를 비교해 같으면 True, 다르면 False를 return 하는 solution를 완성하세요. 'p', 'y' 모두 하나도 없는 경우는 항상 True를 리턴합니다. 단, 개수를 비교할 때 대문자와 소문자는 구별하지 않습니다.
예를 들어 s가 "pPoooyY"면 true를 return하고 "Pyy"라면 false를 return합니다.

 

제한사항

  • 문자열 s의 길이 : 50 이하의 자연수
  • 문자열 s는 알파벳으로만 이루어져 있습니다.

 

function solution(s){
    const arr = [...s.toLowerCase()]
    const p = arr.filter(list => list === 'p')
    const y = arr.filter(list => list === 'y')
    
    return p.length === y.length ? true : false
}

문자열(String)을 배열로 만들기

  • 전개 연산자(Spread Operator)

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

const str = 'abc'
const arrStr = [...str]

arrStr // ['a', 'b', 'c']

 

  • split()

split() 메서드는 string 객체를 지정한 구분자를 이용하여 여러 개의 문자열로 나눈다.

const str = 'abc'
const arrStr = str.split('')

arrStr //  ['a', 'b', 'c']

 

  • Array.from()

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

Array.from('abc') // ['a', 'b', 'c']

 

숫자(Number)을 배열로 만들기

map, split 등의 메소드들이 문자열에서만 사용이 가능하기 때문에 타입을 문자열로 바꾼 후, 다시 숫자로 바꿔준다.

 

  • String() + Number() + map()

String() 함수를 사용하여 다른 타입의 값을 문자열로 바꿀 수 있다.

Number() 함수를 사용하여 다른 타입의 값을 숫자로 바꿀 수 있다.

map() 메서드는 배열 내의 모든 요소에 대하여 주어진 함수를 호출한 결과를 모아 새로운 배열로 반환한다.

const num = 123
const arrNum = [...String(num)].map(Number)

arrNum // [1, 2, 3]

 

  • toString() + map()

toString() 메서드는 문자열을 반환한다.

const num = 123
const arrNum = num.toString().split('').map(Number)

arrNum // [1, 2, 3]

 

  • 문자열 더하기 + Array.from()

숫자에 문자를 더하면 타입이 문자열로 바뀐다.

const num = 123
const arrNum = (num + '').split('')

Array.from(arrNum, Number) // [1, 2, 3]

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

 

문제 설명

정수를 담고 있는 배열 arr의 평균값을 return하는 함수, solution을 완성해보세요.

 

제한사항

  • arr은 길이 1 이상, 100 이하인 배열입니다.
  • arr의 원소는 -10,000 이상 10,000 이하인 정수입니다.

 

function solution(arr) {
    return arr.reduce((arr, cur) => arr + cur) / arr.length
}
  • 소수점 자리수 올림

Math.ceil() 메서드는 주어진 숫자보다 크거나 같은 숫자 중 가장 작은 숫자를 반환한다.

Math.ceil(1.2) // 2
Math.ceil(1.8) // 2

Math.ceil(-1.2) // -1
Math.ceil(-1.8) // -1

 

  • 소수점 자리수 내림

Math.floor() 메서드는 주어진 숫자와 같거나 작은 정수 중에서 가장 큰 수를 반환한다.

Math.floor(1.2) // 1
Math.floor(1.8) // 1

Math.floor(-1.2) // -2
Math.floor(-1.8) // -2

 

  • 소수점 자리수 반올림

Math.round() 메서드는 입력값을 반올림한 수와 가장 가까운 정수 값을 반환한다.

Math.round(1.2) // 1
Math.round(1.5) // 2
Math.round(1.8) // 2

Math.round(-1.2) // -1
Math.round(-1.5) // -1
Math.round(-1.8) // -2

 

  • 소수점 제거

Math.trunc() 메서드는 주어진 값의 소수 부분을 제거하고, 숫자의 정수 부분을 반환한다.

Math.trunc(1.2) // 1
Math.trunc(1.8) // 1

 

Math.floor() / Math.trunc()의 차이점

Math.floor() 메서드는 수학적 계산을 통해 양수, 음수 내림을 적용하는데

Math.trunc() 메서드는 소수점 이하를 전부 제거해 음수의 경우에도 -10을 반환한다.

Math.floor(5.6789) // 5
Math.trunc(5.6789) // 5

Math.floor(-10.12345) // -11
Math.trunc(-10.12345) // -10

 

  • 소수점 자르기

toFixed() 메서드는 숫자를 고정 소수점 표기법으로 표시한다.

const num1 = 0.1234
const num2 = 5.6789

num1.toFixed(1) // '0.1'
num2.toFixed(2) // '5.68'

 

  • 특정 자리수에서 올림
const number = 1.2345

const temp1 = number * 100 // 123.45
const temp2 = Math.ceil(temp1) // 124

const result = temp2 / 100 // 1.24

 

  • 특정 자리수에서 내림
const number = 1.2345

const temp1 = number * 100 // 123.45
const temp2 = Math.floor(temp1) // 123

const result = temp2 / 100 // 1.23

 

Math는 수학적인 상수와 함수를 위한 속성과 메서드를 가진 내장 객체이다. 함수 객체가 아니고, Number 자료형만 지원한다.

 

  • Math.abs(x)

숫자의 절대값을 반환한다.

 

  • Math.ceil(x)

수보다 크거나 같은 수 중에서 가장 작은 정수를 반환한다. (소수점 올림)

 

  • Math.floor(x)

인수보다 작거나 같은 수 중에서 가장 큰 정수를 반환한다. (소수점 내림)

 

  • Math.round(x)

숫자에서 가장 가까운 정수를 반환한다. (소수점 반올림)

 

  • Math.trunc(x)

소수 자리수를 제거하여 숫자의 정수 부분을 반환한다.

 

  • Math.min([x, ...])

0개 이상의 인수에서 제일 작은 수를 반환한다.

 

  • Math.max([x, ...])

0개 이상의 인수에서 제일 큰 수를 반환한다.

 

  • Math.random()

0과 1 사이의 난수를 반환한다.

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

 

문제 설명

문자열 "hello"에서 각 문자를 오른쪽으로 한 칸씩 밀고 마지막 문자는 맨 앞으로 이동시키면 "ohell"이 됩니다. 이것을 문자열을 민다고 정의한다면 문자열 A와 B가 매개변수로 주어질 때, A를 밀어서 B가 될 수 있다면 밀어야 하는 최소 횟수를 return하고 밀어서 B가 될 수 없으면 -1을 return 하도록 solution 함수를 완성해보세요.

 

제한사항

  • 0 < A의 길이 = B의 길이 < 100
  • A, B는 알파벳 소문자로 이루어져 있습니다.

 

pop(): 배열에서 마지막 요소를 제거하고, 그 요소를 반환한다.

unshift(): 새로운 요소를 배열의 맨 앞쪽에 추가하고, 새로운 길이를 반환한다.

function solution(A, B) {
    let arrA = [...A]
    
    for(i=1; i<arrA.length; i++) {
        if(A === B) {
            return 0
        } else {
            arrA.unshift(arrA.pop())
            
            if(arrA.join('') === B) {
                return i
            }
        }
    }
    
    return -1
}

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

 

문제 설명

머쓱이는 태어난 지 6개월 된 조카를 돌보고 있습니다. 조카는 아직 "aya", "ye", "woo", "ma" 네 가지 발음을 최대 한 번씩 사용해 조합한(이어 붙인) 발음밖에 하지 못합니다. 문자열 배열 babbling이 매개변수로 주어질 때, 머쓱이의 조카가 발음할 수 있는 단어의 개수를 return하도록 solution 함수를 완성해주세요.

 

제한사항

  • 1 ≤ babbling의 길이 ≤ 100
  • 1 ≤ babbling[i]의 길이 ≤ 15
  • babbling의 각 문자열에서 "aya", "ye", "woo", "ma"는 각각 최대 한 번씩만 등장합니다.
  • 즉, 각 문자열의 가능한 모든 부분 문자열 중에서 "aya", "ye", "woo", "ma"가 한 번씩만 등장합니다.
  • 문자열은 알파벳 소문자로만 이루어져 있습니다.

 

단어를 "aya", "ye", "woo", "ma"로 다 발음할 수 있어야 한다.
단어 중 일부만 발음할 수 있어도 발음할 수 있는 단어가 아니다.

function solution(babbling) {
    let words = []
    let answer = 0
    
    for(i=0; i<babbling.length; i++){
        words[i] = babbling[i].replace(/aya|ye|woo|ma/g, '')
        
        if(words[i] === '') {
            answer++
        }
    }
    
    return answer
}

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

 

문제 설명

등차수열 혹은 등비수열 common이 매개변수로 주어질 때, 마지막 원소 다음으로 올 숫자를 return 하도록 solution 함수를 완성해보세요.

 

제한사항

  • 2 < common의 길이 < 1,000
  • -1,000 < common의 원소 < 2,000
  • common의 원소는 모두 정수입니다.
  • 등차수열 혹은 등비수열이 아닌 경우는 없습니다.
  • 등비수열인 경우 공비는 0이 아닌 정수입니다.

 

등차수열(+): 연속하는 두 항의 차이가 모두 일정한 수열
등비수열(*): 각 항이 초항(첫번째 값)과 일정한 비를 가지는 수열

function solution(common) {
    const lastNum = Number(common.slice(-1))
    
    // 등차
    if(common[1] - common[0] === common[2] - common[1]) {
        return lastNum + (common[1] - common[0])
    }
    
    // 등비
    if(common[1] / common[0] === common[2] / common[1]) {
        return lastNum * (common[1] / common[0])
    }
}

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

 

문제 설명

다음 그림과 같이 지뢰가 있는 지역과 지뢰에 인접한 위, 아래, 좌, 우 대각선 칸을 모두 위험지역으로 분류합니다.


지뢰는 2차원 배열 board에 1로 표시되어 있고 board에는 지뢰가 매설 된 지역 1과, 지뢰가 없는 지역 0만 존재합니다.
지뢰가 매설된 지역의 지도 board가 매개변수로 주어질 때, 안전한 지역의 칸 수를 return하도록 solution 함수를 완성해주세요.

 

제한사항

  • board는 n * n 배열입니다.
  • 1 ≤ n ≤ 100
  • 지뢰는 1로 표시되어 있습니다.
  • board에는 지뢰가 있는 지역 1과 지뢰가 없는 지역 0만 존재합니다.

 

새로운 2차원 배열을 만들어 지뢰와 위험지역을 모두 1로 표시한다.

0인 지역이 위험지역이 아니므로 0의 개수가 안전한 지역이다.

function solution(board) {
    // 위험 지역을 표시할 새로운 2차원 배열
    let dangerArr = Array.from(Array(board.length), () => Array(board.length).fill(0))
    const length = board.length
    
    for(i=0; i<length; i++) {
        for(j=0; j<length; j++) {            
            if(board[i][j] === 1) {
                dangerArr[i][j] = 1

                if(i > 0) {   
                    dangerArr[i-1][j-1] = 1
                    dangerArr[i-1][j] = 1
                    dangerArr[i-1][j+1] = 1   
                    
                    dangerArr[i][j-1] = 1
                    dangerArr[i][j] = 1
                    dangerArr[i][j+1] = 1  
                }
                
                if(i + 1 < length) {
                    dangerArr[i][j-1] = 1
                    dangerArr[i][j] = 1
                    dangerArr[i][j+1] = 1  
                    
                    dangerArr[i+1][j-1] = 1
                    dangerArr[i+1][j] = 1
                    dangerArr[i+1][j+1] = 1  
                }
            }
        }
    }
    
    // 안전지대 
    let safe = 0
    
    for(x=0; x<length; x++) {
        for(y=0; y<length; y++) {
            if(dangerArr[x][y] === 0) {
                safe++
            }
        }
    }
    
    return safe
}

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

 

문제 설명

연속된 세 개의 정수를 더해 12가 되는 경우는 3, 4, 5입니다. 두 정수 num과 total이 주어집니다. 연속된 수 num개를 더한 값이 total이 될 때, 정수 배열을 오름차순으로 담아 return하도록 solution함수를 완성해보세요.

 

제한사항

  • 1 ≤ num ≤ 100
  • 0 ≤ total ≤ 1000
  • num개의 연속된 수를 더하여 total이 될 수 없는 테스트 케이스는 없습니다.

 

function solution(num, total) {
    let result = []
    
    // 가운데 값
    const avg = Math.ceil(total / num)

    // 가운데 값이 짝수인지 홀수인지에 따라서 시작 위치 구하기
    const x = Math.trunc(num / 2)

    // 시작 값
    const startNum = avg - x 

    for(i=0; i<num; i++){
        result.push(startNum + i)
    }
    
    return result
}

+ Recent posts