본문 바로가기
codingtest

[programmers] 문자열 안에 문자열, OX 퀴즈, 자릿수 더하기, n의 배수 고르기, 숫자 찾기

by 안자두 2023. 3. 5.

📝 [Lv0] 문자열 안에 문자열

👀 문제 설명

문자열 str1, str2가 매개변수로 주어집니다. str1 안에 str2가 있다면 1을 없다면 2를 return하도록 solution 함수를 완성해주세요.

 

🚨 제한 사항

  • 1 ≤ str1의 길이 ≤ 100
  • 1 ≤ str2의 길이 ≤ 100
  • 문자열은 알파벳 대문자, 소문자, 숫자로 구성되어 있습니다.

 

💻 입출력 예


"ab6CDE443fgh22iJKlmn1o" "6CD" 1
"ppprrrogrammers" "pppp" 2
"AbcAbcA" "AAA" 2

 

✨ 풀이 설명

includes() 함수를 사용해 str1 안에 str2가 포함되어 있는지 확인해 주었다.

첫 번째는 삼항 연산자를 통해 포함되면 1, 아니면 2를 반환해 주었고,
두 번째는 불리언 값을 숫자로 변환해 논리 연산자를 사용해 포함되지 않을 경우 2를 반환하도록 해주었다.

 

🕵️‍♂️ 코드

function solution(str1, str2) {
  return str1.includes(str2) ? 1 : 2;
}

function solution(str1, str2) {
  return +str1.includes(str2) || 2;
}

 


📝 [Lv0] OX 퀴즈

👀 문제 설명

덧셈, 뺄셈 수식들이 'X [연산자] Y = Z' 형태로 들어있는 문자열 배열 quiz가 매개변수로 주어집니다. 수식이 옳다면 "O"를 틀리다면 "X"를 순서대로 담은 배열을 return하도록 solution 함수를 완성해주세요.

 

🚨 제한 사항

  • 연산 기호와 숫자 사이는 항상 하나의 공백이 존재합니다. 단 음수를 표시하는 마이너스 기호와 숫자 사이에는 공백이 존재하지 않습니다.
  • 1 ≤ quiz의 길이 ≤ 10
  • X, Y, Z는 각각 0부터 9까지 숫자로 이루어진 정수를 의미하며, 각 숫자의 맨 앞에 마이너스 기호가 하나 있을 수 있고 이는 음수를 의미합니다.
  • X, Y, Z는 0을 제외하고는 0으로 시작하지 않습니다.
  • -10,000 ≤ X, Y ≤ 10,000
  • -20,000 ≤ Z ≤ 20,000
  • [연산자]는 + 와 - 중 하나입니다.

 

💻 입출력 예


["3 - 4 = -3", "5 + 6 = 11"] ["X", "O"]
["19 - 6 = 13", "5 + 66 = 71", "5 - 15 = 63", "3 - 1 = 2"] ["O", "O", "X", "O"]

 

✨ 풀이 설명

간단히 풀기 위해 eval() 함수를 사용해서 문제를 풀었지만,  실제 코드 상에서 eval()의 사용은 지양되니, 다른 방법으로도 풀어보았다.

eval을 사용하면 안 되는 이유
eval()은 인자로 받은 코드를 caller의 권한으로 수행하는 위험한 함수입니다. 악의적인 영향을 받았을 수 있는 문자열을 
eval()로 실행한다면, 당신의 웹페이지나 확장 프로그램의 권한으로 사용자의 기기에서 악의적인 코드를 수행하는 결과를 초래할 수 있습니다. 또한, 제3자 코드가 eval()이 호출된 위치의 스코프를 볼 수 있으며, 이를 이용해 비슷한 함수인 
Function으로는 실현할 수 없는 공격이 가능합니다.

참고로 실행 속도 또한 차이가 난다.

첫 번째(좌) 코드 결과와 두 번째(우) 코드 결과

 

🕵️‍♂️ 코드

function solution(quiz) {
  return quiz.map(string => {
    const [expr, res] = string.split('=');
    return eval(expr) === +res ? 'O' : 'X';
  })
}
function solution(quiz) {
  const calc = (o1, oper, o2) => oper === '+' ? +o1 + +o2 : +o1 - +o2;

  return quiz.map(string => {
    const [operand1, operator, operand2, _, res] = string.split(' ');
    return calc(operand1, operator, operand2) === +res ? 'O' : 'X';
  })
}

📝 [Lv0] 자릿수 더하기

👀 문제 설명

정수 n이 매개변수로 주어질 때 n의 각 자리 숫자의 합을 return하도록 solution 함수를 완성해주세요

 

🚨 제한 사항

  • 0 ≤ n ≤ 1,000,000

 

💻 입출력 예


1234 10
930211 16

 

✨ 풀이 설명

자료형에 따라 결괏값이 달라지는 점에 초점을 둔 것 같은 문제였다. 우선 'Number'로 들어온 값을 'String'로 변경하여 배열화해 준 후, reduce() 함수를 사용해 각 인덱스 값을 다시 'String'에서 'Number'로 변환하여 누적해 주었다.

간단하게 함수 대신 백틱(`)을 사용해 문자로 변환해 주었고, +연산자를 사용해 숫자로 변환해 주었다.
자세한 타입 변환에 대해서는 링크 참고 !

 

🕵️‍♂️ 코드

function solution(n) {
  return [...`${n}`].reduce((total, num) => total + +num, 0);
}

 


📝 [Lv0] n의 배수 고르기

👀 문제 설명

정수 n과 정수 배열 numlist가 매개변수로 주어질 때, numlist에서 n의 배수가 아닌 수들을 제거한 배열을 return하도록 solution 함수를 완성해주세요.

 

🚨 제한 사항

  • 1 ≤ n ≤ 10,000
  • 1 ≤ numlist의 크기 ≤ 100
  • 1 ≤ numlist의 원소 ≤ 100,000

 

💻 입출력 예


3 [4, 5, 6, 7, 8, 9, 10, 11, 12] [6, 9, 12]
5 [1, 9, 3, 10, 13, 5] [10, 5]
12 [2, 100, 120, 600, 12, 12] [120, 600, 12, 12]

 

✨ 풀이 설명

문제 설명만 보면 기존 리스트에서 제거해야 할 것 같지만, 나는 numlist 중, n의 배수인 숫자만 따로 추출해 새로운 배열로 반환해 주었다. 기존 배열을 건드는 것보다는, 새로운 배열을 생성하는 것이 예상치 못한 다른 효과도 나타나지 않아, 실제로도 새로운 배열 생성을 지향한다.

filter() 함수를 사용해 전체 numlist 중, n으로 나누어 떨어지는 것만(즉, 나머지가 0인 것들만) 새로운 배열로 생성한 후, 반환해 주었다.

 

🕵️‍♂️ 코드

function solution(n, numlist) {
  return numlist.filter(num => !(num % n));
}

 


📝 [Lv0] 숫자 찾기

👀 문제 설명

정수 num k가 매개변수로 주어질 때, num을 이루는 숫자 중에 k가 있으면 num의 그 숫자가 있는 자리 수를 return하고 없으면 -1을 return 하도록 solution 함수를 완성해보세요.

 

🚨 제한 사항

  • 0 < num < 1,000,000
  • 0 ≤ k < 10
  • num에 k가 여러 개 있으면 가장 처음 나타나는 자리를 return 합니다.

 

💻 입출력 예


29183 1 3
232443 4 4
123456 7 -1

 

✨ 풀이 설명

프로그래머스의 문자열 밀기 문제와 비슷한 문제인 것 같다. 대신 다른 점은 숫자 중에서 인덱스를 찾는 거라 문자로 변환해야 한다는 점과, 찾은 인덱스는 인덱스 그대로가 아닌 몇 번째에 위치해 있는지를 반환해야 한다는 점이다.

그래서 우선, 문자로 변환한 후, 인덱스를 구한다. 구한 인덱스에 1을 더하게 되면, 존재하는 숫자의 경우에는 몇번째에 위치하는지를 알 수 있게 되고, 존재하지 않는 경우는 -1에서 1을 더한 0이 된다.
이와 논리 연산자(||)를 사용해 값이 존재하면(몇 번째에 위치하는지 알게 되면) 해당 값을 반환해 주었고, 존재하지 않는다면(계산 값이 0이 되면), -1을 반환해 주었다.

 

🕵️‍♂️ 코드

function solution(num, k) {
  return `${num}`.indexOf(k) + 1 || -1;
}

 

728x90