코딩 공부/코딩테스트

자바스크립트 코딩테스트 입문 (16)

천서리 2023. 5. 31. 20:58
QUOTE THE DAY

“ 당신이 6개월 이상 한 번도 보지 않은 코드는 다른 사람이 다시 만드는 게 훨씬 더 나을 수 있다. ”

- 이글슨 (Eagleson)
반응형

코딩테스트 입문 Day 16 문자열, 수학, 배열, 조건문

출처 : https://programmers.co.kr/

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


편지

문제

머쓱이는 할머니께 생신 축하 편지를 쓰려고 합니다. 할머니가 보시기 편하도록 글자 한 자 한 자를 가로 2cm 크기로 적으려고 하며, 편지를 가로로만 적을 때, 축하 문구 message를 적기 위해 필요한 편지지의 최소 가로길이를 return 하도록 solution 함수를 완성해주세요.

 

 

제한사항

  • 공백도 하나의 문자로 취급합니다.
  • 1 ≤ message의 길이 ≤ 50
  • 편지지의 여백은 생각하지 않습니다.
  • message는 영문 알파벳 대소문자, ‘!’, ‘~’ 또는 공백으로만 이루어져 있습니다.

 

입출력 예

message result
"happy birthday" 30
"i love you" 22

 

입출력 예 설명

 

입출력 예 #1

  • message의 글자 수가 15개로 최소 가로 30cm의 편지지가 필요합니다.

입출력 예 #2

  • message의 글자 수가 11개로 최소 가로 22cm의 편지지가 필요합니다.

 

solution.js

function solution(message) {
  var answer = (message.replace(/ /g, '').length + message.split(' ').length - 1) * 2;
  return answer;
}
  1. 여기서 사용된 정규식 / /g는 공백을 찾기 위한 패턴입니다. message.replace(/ /g, '')message에서 모든 공백을 제거한 새로운 문자열을 생성합니다.
  2. message.split(' ')message를 공백을 기준으로 분리한 배열을 생성합니다. 예를 들어, "Hello World"라는 메시지가 주어졌을 경우, 이 배열은 ["Hello", "World"]가 됩니다.
  3. message.replace(/ /g, '').length는 공백을 제거한 후의 문자열 길이를 나타내며, message.split(' ').length는 단어의 개수를 나타냅니다. 이 두 값을 더한 후에 -1을 하여 단어 사이의 공백 개수를 제거합니다.

최종적으로 (message.replace(/ /g, '').length + message.split(' ').length - 1) * 2는 입력된 메시지의 길이와 단어의 개수를 계산하여, 이를 2배로 만든 결과를 answer 변수에 저장합니다. 마지막으로 answer를 반환합니다.


가장 큰 수 찾기

문제

정수 배열 array가 매개변수로 주어질 때, 가장 큰 수와 그 수의 인덱스를 담은 배열을 return 하도록 solution 함수를 완성해보세요.

 

 

제한사항

  • 1 ≤ array의 길이 ≤ 100
  • 0 ≤ array 원소 ≤ 1,000
  • array에 중복된 숫자는 없습니다.

 

입출력 예

array result
[1, 8, 3] [8, 1]
[9, 10, 11, 8] [11, 2]

 

입출력 예 설명

 

입출력 예 #1

  • 1, 8, 3 중 가장 큰 수는 8이고 인덱스 1에 있습니다.

입출력 예 #2

  • 9, 10, 11, 8 중 가장 큰 수는 11이고 인덱스 2에 있습니다.

 

solution.js

function solution(array) {
  var max = 0;
  var index = 0;

  for (var i = 0; i < array.length; i++) {
    if (array[i] > max) {
      max = array[i];
      index = i;
    }
  }

  return [max, index];
}
  1. 우선 max 변수와 index 변수를 초기화합니다. max는 가장 큰 수를 저장할 변수이고, index는 가장 큰 수의 인덱스를 저장할 변수입니다.
  2. for 루프를 사용하여 배열을 반복하면서 가장 큰 수와 그 인덱스를 찾습니다. 루프의 조건은 i < array.length로 배열의 길이보다 작은 동안 반복합니다.
  3. 루프 내부에서는 현재 요소가 max보다 큰지 확인합니다. 만약 크다면, max 변수와 index 변수를 업데이트합니다. max 변수를 현재 요소로 업데이트하고, index 변수를 현재 인덱스로 업데이트합니다.
  4. 루프가 끝나면 가장 큰 수와 그 수의 인덱스를 담은 배열인 [max, index]를 반환합니다.

문자열 계산하기

문제

my_string은 "3 + 5"처럼 문자열로 된 수식입니다. 문자열 my_string이 매개변수로 주어질 때, 수식을 계산한 값을 return 하는 solution 함수를 완성해주세요.

 

제한사항

  • 연산자는 +, -만 존재합니다.
  • 문자열의 시작과 끝에는 공백이 없습니다.
  • 0으로 시작하는 숫자는 주어지지 않습니다.
  • 잘못된 수식은 주어지지 않습니다.
  • 5 ≤ my_string의 길이 ≤ 100
  • my_string을 계산한 결과값은 1 이상 100,000 이하입니다.
    • my_string의 중간 계산 값은 -100,000 이상 100,000 이하입니다.
    • 계산에 사용하는 숫자는 1 이상 20,000 이하인 자연수입니다.
    • my_string에는 연산자가 적어도 하나 포함되어 있습니다.
  • return type 은 정수형입니다.
  • my_string의 숫자와 연산자는 공백 하나로 구분되어 있습니다.

 

입출력 예

my_string result
"3 + 4" 7

 

입출력 예 설명

 

입출력 예 #1

  • 3 + 4 = 7을 return 합니다.

 

solution.js

function solution(my_string) {
    const stack = [];

    let sign = 1;
    for (const ch of my_string.split(" ")) {
        if (ch === "+") {
            sign = 1;
        } else if (ch === "-") {
            sign = -1;
        } else {
            stack.push(ch * sign);
        }
    }

    return stack.reduce((a,b) => a + b, 0);
}
  1. stack이라는 빈 배열을 생성합니다. 이 배열은 숫자를 저장하는 스택(Stack)으로 사용될 것입니다.
  2. sign 변수는 초기값으로 1을 갖고 있습니다. 이 변수는 숫자에 대한 부호를 결정하는데 사용됩니다. 기본적으로 양수를 나타내는 1입니다.
  3. 주어진 문자열을 공백을 기준으로 분리하여 반복합니다. for...of 문법을 사용하여 문자열을 순회하며 각각의 요소를 ch 변수에 할당합니다.
  4. ch 변수가 "+"일 경우, sign 변수를 1로 업데이트합니다. 즉, 이후 숫자는 양수로 처리됩니다.
  5. ch 변수가 "-"일 경우, sign 변수를 -1로 업데이트합니다. 이후 숫자는 음수로 처리됩니다.
  6. 위의 두 경우가 아닌 경우, ch 변수를 숫자로 변환하여 sign 변수와 곱한 후, stack 배열에 추가합니다. 이는 숫자에 부호를 적용하여 스택에 저장하는 것을 의미합니다.
  7. 모든 요소를 처리한 후, stack.reduce((a, b) => a + b, 0)를 통해 stack 배열의 요소들을 더하여 최종 결과를 반환합니다. 이 부분은 배열의 reduce 메서드를 사용하여 모든 요소를 더하는 역할을 합니다.

배열의 유사

문제

두 배열이 얼마나 유사한지 확인해보려고 합니다. 문자열 배열 s1과 s2가 주어질 때 같은 원소의 개수를 return하도록 solution 함수를 완성해주세요.

 

 

제한사항

  • 1 ≤ s1, s2의 길이 ≤ 100
  • 1 ≤ s1, s2의 원소의 길이 ≤ 10
  • s1과 s2의 원소는 알파벳 소문자로만 이루어져 있습니다
  • s1과 s2는 각각 중복된 원소를 갖지 않습니다.

 

입출력 예

s1 s2 result
["a", "b", "c"] ["com", "b", "d", "p", "c"] 2
["n", "omg"] ["m", "dot"] 0

 

입출력 예 설명

 

입출력 예 #1

  • "b"와 "c"가 같으므로 2를 return합니다.

입출력 예 #2

  • 같은 원소가 없으므로 0을 return합니다.

 

solution.js

function solution(s1, s2) {
  var count = 0;

  for (var i = 0; i < s1.length; i++) {
    for (var j = 0; j < s2.length; j++) {
      if (s1[i] === s2[j]) {
        count++;
        break;
      }
    }
  }

  return count;
}
  1. count 변수를 초기화하여 동일한 원소의 개수를 저장할 변수로 설정합니다.
  2. 첫 번째 for 루프는 s1 문자열을 반복합니다. i 변수는 s1 문자열의 인덱스를 나타냅니다.
  3. 내부에는 두 번째 for 루프가 있으며, s2 문자열을 반복합니다. j 변수는 s2 문자열의 인덱스를 나타냅니다.
  4. 각각의 for 루프에서 s1[i]s2[j]를 비교하여 같은 원소를 찾습니다. 두 문자가 동일한 경우, count 변수를 증가시키고 break 문을 사용하여 내부 for 루프를 종료합니다. 이는 중복된 원소를 다시 세지 않도록 하기 위함입니다.
  5. 모든 비교가 완료된 후, count 변수에 저장된 값을 반환합니다.

 

반응형
Adventure Time - BMO