본문 바로가기
codingtest

[programmers] 가까운 수, 삼각형의 완성조건 (1), 중복된 문자 제거, k의 개수, A로 B 만들기

by 안자두 2023. 3. 10.

📝 [Lv0] 가까운 수

👀 문제 설명

정수 배열 array와 정수 n이 매개변수로 주어질 때, array에 들어있는 정수 중 n과 가장 가까운 수를 return 하도록 solution 함수를 완성해주세요.

 

🚨 제한 사항

  • 1 ≤ array의 길이 ≤ 100
  • 1 ≤ array의 원소 ≤ 100
  • 1 ≤ n ≤ 100
  • 가장 가까운 수가 여러 개일 경우 더 작은 수를 return 합니다.

 

💻 입출력 예

array n result
[3, 10, 28] 20 28
[10, 11, 12] 13 12

 

✨ 풀이 설명

기본값을 큰 수인 10e9로 초기화해주었다. 가까운 수가 여러 개일 경우, 더 작은 수를 반환하라는 조건이 있었기 때문에, 첫 번째 조건문으로 같다면 두 비교하는 수 중, 작은 수를 반환해 주었다.
그리고 아래 조건에서 현재까지 중, 가장 작은 수와 현재 num을 비교하여 더 가까운 수를 answer에 재할당해 주었다.

 

🕵️‍♂️ 코드

function solution(array, n) {
  let answer = 10e9;
  array.forEach(num => {
    if (Math.abs(num - n) === Math.abs(answer - n)) answer = Math.min(answer, num);
    if (Math.abs(num - n) < Math.abs(answer - n)) answer = num;
  });
  return answer;
}

 


📝 [Lv0] 삼각형의 완성조건 (1)

👀 문제 설명

선분 세 개로 삼각형을 만들기 위해서는 다음과 같은 조건을 만족해야 합니다.

  • 가장 긴 변의 길이는 다른 두 변의 길이의 합보다 작아야 합니다.

삼각형의 세 변의 길이가 담긴 배열 sides이 매개변수로 주어집니다. 세 변으로 삼각형을 만들 수 있다면 1, 만들 수 없다면 2를 return하도록 solution 함수를 완성해주세요.

 

🚨 제한 사항

  • sides의 원소는 자연수입니다.
  • sides의 길이는 3입니다.
  • 1 ≤ sides의 원소 ≤ 1,000

 

💻 입출력 예

sides result
[1, 2, 3] 2
[3, 6, 2] 2
[199, 72, 222] 1

 

✨ 풀이 설명

가장 긴 변은 나머지 길이들의 합보다 작아야 한다. 전체 변 길이의 합은 '가장 긴 변' + '나머지 변들의 합'이다.
따라서, '전체 변 길이의 합' - '가장 긴 변' > '가장 긴 변'이라는 식이 완성되고, 식을 변형하면,
'전체 변 길이의 합' > '가장 긴 변' * 2 가 된다.

reduce()를 사용해 전체의 합을 구해주고, Math.max()를 사용해 가장 긴 변을 구해주면 아래와 같이 해결할 수 있다.

 

🕵️‍♂️ 코드

function solution(sides) {
  return sides.reduce((sum, side) => sum + side, 0) > 2 * Math.max(...sides) ? 1 : 2;
}

 


📝 [Lv0] 중복된 문자 제거

👀 문제 설명

문자열 my_string이 매개변수로 주어집니다. my_string에서 중복된 문자를 제거하고 하나의 문자만 남긴 문자열을 return하도록 solution 함수를 완성해주세요.

 

🚨 제한 사항

  • 1 ≤ my_string ≤ 110
  • my_string은 대문자, 소문자, 공백으로 구성되어 있습니다.
  • 대문자와 소문자를 구분합니다.
  • 공백(" ")도 하나의 문자로 구분합니다.
  • 중복된 문자 중 가장 앞에 있는 문자를 남깁니다.

 

💻 입출력 예

my_string result
"people" "peol"
"We are the world" "We arthwold"

 

✨ 풀이 설명

set.add()는 새로운 요소가 추가된 Set 객체를 반환한다. 즉, 무조건 true가 반환된다는 특징을 이용해 이번 문제를 풀었다.
우선 새로운 Set()을 하나 생성해 준 다음, my_string에서 중복되지 않은 문자만 반환받을 수 있도록 filter()를 사용했다.
우선, set 안에 해당 문자가 없고, 해당 문자를 추가해 주었을 때 true 값이 반환되도록 조건을 걸어주었다.
즉, 중복 여부는 조건문의 앞부분에서 판별되기 때문에 뒷부분이 무조건 true여도 상관이 없다.

나는 Set()이 내부적으로 순서를 보장하지 않는다고 생각해 이런 방식으로 해결했다.
다시 찾아보니 Set 객체는 요소의 순서에 의미를 갖지는 않지만, Set 객체를 순회하는 순서는 요소가 추가된 순서를 따른다. 이는 ECMAScript 사양에 규정되어 있지는 않지만, 다른 이터러블의 순회와 호환성을 유지하기 위함이라고 한다.!
그래서 아래와 같이 간단하게 해결할 수도 있었던 문제였다😂

사실 Level0 문제는 가벼운 마음으로 풀고 있는데, 이런 식으로 기본 개념에 대해 정리할 수 있게 되어 오히려 좋아

 

🕵️‍♂️ 코드

function solution(my_string) {
  const set = new Set();

  return [...my_string].filter(char => !set.has(char) && set.add(char)).join('');
}
function solution(my_string) {
  return [...new Set(my_string)].join('');
}

 


📝 [Lv0] k의 개수

👀 문제 설명

1부터 13까지의 수에서, 1은 1, 10, 11, 12, 13 이렇게 총 6번 등장합니다. 정수 i, j, k가 매개변수로 주어질 때, i부터 j까지 k가 몇 번 등장하는지 return 하도록 solution 함수를 완성해주세요.

 

🚨 제한 사항

  • 1 ≤ i < j ≤ 100,000
  • 0 ≤ k ≤ 9

 

💻 입출력 예

i j k result
1 13 1 6
10 50 5 5
3 10 2 0

 

✨ 풀이 설명

우선 i~j까지의 숫자를 비교해야 하므로, j-i+1개의 배열을 만들어 주었다. 
그다음 reduce를 사용해 각 숫자에서 k가 나온 개수를 더해주었는데, 이번에는 split()을 사용해 보았다.
split()은 파라미터로 받는 문자를 기준으로 전체 문자열을 나눠준다.

만약, 'asddssaas'라는 문자열이 있을 때, 's'를 기준으로 나눈다고 하자.
'asddssaas'.split('s') 이런 코드가 작성될 것이고, 결과는 [ 'a', 'dd', '', 'aa', '' ] 이렇게 나올 것이다.
즉, 반환된 배열은 문자열 중, 's'의 개수보다 1개가 추가되어 반환된다.
이는, 맨 앞이나 맨뒤의 경우 빈 문자열이 반환되기 때문이다.
따라서 이 개념을 이용하여 이번 문제를 풀게 되면 아래와 같은 식으로 도출할 수 있다.

 

🕵️‍♂️ 코드

function solution(i, j, k) {
  return [...new Array(j - i + 1)].reduce((sum, _, idx) => sum + `${i + idx}`.split(k).length - 1, 0);
}

 


📝 [Lv0] A로 B 만들기

👀 문제 설명

문자열 before after가 매개변수로 주어질 때, before의 순서를 바꾸어 after를 만들 수 있으면 1을, 만들 수 없으면 0을 return 하도록 solution 함수를 완성해보세요.

 

🚨 제한 사항

  • 0 < before의 길이 == after의 길이 < 1,000
  • before와 after는 모두 소문자로 이루어져 있습니다.

 

💻 입출력 예

before after result
"olleh" "hello" 1
"allpe" "apple" 0

 

✨ 풀이 설명

문제의 핵심은 두 문자열의 구성 요소가 일치하는지 확인하면 된다는 것이다.
따라서 두 문자열을 배열로 변환해 정렬해 주고 다시 문자열로 변환했을 때, 일치한다면 A와 B는 같은 구성인 것이다.

반환 값이 true일 경우 1, false일 경우 0 이어서 이번에는 삼항 연산자 대신, 타입 변환으로 풀어보았다.
일치 연산자를 사용하면 true, false 불리언 값이 반환되는데, 이를 + 연산자를 사용해 1과 0으로 변환할 수 있다.
즉, 두 문자열이 일치하다면 1, 아니라면 0이 반환된다.

 

🕵️‍♂️ 코드

function solution(before, after) {
  return +([...before].sort().join('') === [...after].sort().join(''));
}

 

728x90