전체 글 (165)

02
19

1. 문제 설명

 

코딩테스트 연습 - 모음사전

사전에 알파벳 모음 'A', 'E', 'I', 'O', 'U'만을 사용하여 만들 수 있는, 길이 5 이하의 모든 단어가 수록되어 있습니다. 사전에서 첫 번째 단어는 "A"이고, 그다음은 "AA"이며, 마지막 단어는 "UUUUU"입니

programmers.co.kr

사전에 알파벳 모음 'A', 'E', 'I', 'O', 'U'만을 사용하여 만들 수 있는, 길이 5 이하의 모든 단어가 수록되어 있습니다. 사전에서 첫 번째 단어는 "A"이고, 그다음은 "AA"이며, 마지막 단어는 "UUUUU"입니다.

단어 하나 word가 매개변수로 주어질 때, 이 단어가 사전에서 몇 번째 단어인지 return 하도록 solution 함수를 완성해주세요.

 

2. 제한 사항

  • word의 길이는 1 이상 5 이하입니다.
  • word는 알파벳 대문자 'A', 'E', 'I', 'O', 'U'로만 이루어져 있습니다.

 

3. 입출력 예제

word result
"AAAAE" 6
"AAAE" 10
"I" 1563
"EIO" 1189

 

4. 나의 접근 방식

  • 가장 청음에 나올 'A' 부터 입력받은 word까지 모든 경우의 수를 배열에 담는다.
  • 사전의 규칙처럼, 한 모음을 돌고 나면 가장 마지막 앞의 모음이 다음 모음으로 바뀌고 가장 끝의 모음이 다시 변경되면서 모든 모음을 넣는 규칙이 있다.
  • 이를 통해 모든 순서를 배열에 담을 수 있다.

 

5. 결과

function solution(word) {
    let result = [];
    let words = ["A", "E", "I", "O", "U"];
    
    // 깊이를 계산할 함수를 선언한다.
    const getWord = (cur, depth) => {
        // 길이가 6이라면
        if (depth === 6) return;
        // 나온 모음의 묶음을 result에 넣는다.
        result.push(cur);

        // 반복문을 돌면서
        for (let i = 0; i < words.length; i++) {
            // 나온 모음에 다음 모음을 추가하면서 깊이를 더 해 준다.
            getWord(cur + words[i], depth + 1);
        }
    };
    
    // 이 과정을 word에서 받은 모음까지의 모든 모음의 묶음을 구한다.
    words.map((word) => getWord(word, 1));
    // 만들어진 모든 순서에 indexOf로 해당하는 모음을 찾아서
    // 0번째 부터 이기 떄문에 + 1 한다.
    return result.indexOf(word) + 1;
}

 

6.  개선점이 있다면?

  • 모든 경우의 수를 구한다는 것이 효율성이 매우 떨어진다. 더 간단하게 패턴을 이용해 풀 수는 없을까?
  • DFS를 이용하여 푸는 방식이 있다는데 찾아볼 필요가 있다.
  • 자료구조에 대한 자유로운 사용이 선행 되어야 더 쉽게 적용하고 풀 수 있을 것이다.
COMMENT
 
02
18

1. 문제 설명

 

코딩테스트 연습 - 124 나라의 숫자

 

programmers.co.kr

124 나라가 있습니다. 124 나라에서는 10진법이 아닌 다음과 같은 자신들만의 규칙으로 수를 표현합니다.

  1. 124 나라에는 자연수만 존재합니다.
  2. 124 나라에는 모든 수를 표현할 때 1, 2, 4만 사용합니다.

예를 들어서 124 나라에서 사용하는 숫자는 다음과 같이 변환됩니다.

10진법 124 나라 10진법 124 나라
1 1 6 14
2 2 7 21
3 4 8 22
4 11 9 24
5 12 10 41

자연수 n이 매개변수로 주어질 때, n을 124 나라에서 사용하는 숫자로 바꾼 값을 return 하도록 solution 함수를 완성해 주세요.

 

2. 제한 사항

  • n은 500,000,000이하의 자연수 입니다.

 

3. 입출력 예제

n result
1 1
2 2
3 4
4 11

 

4. 나의 접근 방식

  • n을 3으로 나눈 후에 나머지가 1, 2, 4로 나올 수 있다는 것을 계속 보다 보니 알게 되었다.
  • n이 나누어 떨어질 때의 상황에는 n을 3으로 나눈 것에 -1을 해주면 된다.
  • 그 이외에 상황을 Math.floor로 반올림하면 모든 상황에도 계산이 가능하다.

 

5. 결과

function solution(n) {
    let result = '';
    // arr에 숫자들을 넣어 index에 맞게 넣을 것이다.
    let arr = [4, 1, 2];
    
    while(n) {
        // n을 3으로 나눈 후 나머지를 result와 더한다.
        // result는 빈 문자열이라서 그대로 더해진다.
        result = arr[n % 3] + result;
        // 나누어 떨어지는 경우는 1을 뺴준다.
        if(n % 3 === 0) n = n / 3 - 1
        else n = Math.floor(n / 3)
    }
    return result;
}
COMMENT
 
02
17

1. 문제 설명

 

코딩테스트 연습 - 타겟 넘버

n개의 음이 아닌 정수들이 있습니다. 이 정수들을 순서를 바꾸지 않고 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수

programmers.co.kr

n개의 음이 아닌 정수들이 있습니다. 이 정수들을 순서를 바꾸지 않고 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수 있습니다.

-1+1+1+1+1 = 3
+1-1+1+1+1 = 3
+1+1-1+1+1 = 3
+1+1+1-1+1 = 3
+1+1+1+1-1 = 3

사용할 수 있는 숫자가 담긴 배열 numbers, 타겟 넘버 target이 매개변수로 주어질 때 숫자를 적절히 더하고 빼서 타겟 넘버를 만드는 방법의 수를 return 하도록 solution 함수를 작성해주세요.

 

2. 제한 사항

  • 주어지는 숫자의 개수는 2개 이상 20개 이하입니다.
  • 각 숫자는 1 이상 50 이하인 자연수입니다.
  • 타겟 넘버는 1 이상 1000 이하인 자연수입니다.

 

3. 입출력 예제

numbers target return
[1, 1, 1, 1, 1] 3 5
[4, 1, 2, 1] 4 2

 

4. 나의 접근 방식

  • dfs를 이용해 전부 탐색한다.
  • 왼쪽, 오른쪽으로 나눠 노드를 타고 들어가면서 원하는 타겟넘버가 나오는 경우를 찾아 count를 올려서 그래프를 다 돌면 반환한다.

 

5. 결과

function solution(numbers, target) {
    let result = 0;

    // 레벨과 더해준 target을 이용한다.
    const dfs = (level, sum) => {
        // 레벨이 number의 길이만큼 가면 함수를 끝낸다.
        if (level === numbers.length) {
        // 더 해준 결과값이 target과 같다면 + 1을 해준다.
        if (sum === target) result += 1;
        return;
    }
      // 왼쪽, 오른쪽의 모든 노드들을 전부 검사해 준다.
      dfs(level + 1, sum + numbers[level]);
      dfs(level + 1, sum - numbers[level]);
    }

    // 만들어준 제귀함수를 사용한다.
    dfs(0, 0);

    return result;
}
COMMENT
 
02
15

1. 문제 설명

 

코딩테스트 연습 - 가장 큰 수

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰

programmers.co.kr

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.

예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.

0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.

 

2. 제한 사항

  • numbers의 길이는 1 이상 100,000 이하입니다.
  • numbers의 원소는 0 이상 1,000 이하입니다.
  • 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.

 

3. 입출력 예제

numbers return
[6, 10, 2] "6210"
[3, 30, 34, 5, 9] "9534330"

 

4. 나의 접근 방식

  • 각각의 수를 sort를 이용해 정렬하면 된다고 생각하였다.
  • 그리고 나온 수를 string으로 바꾸어 넣어주면 된다.
  • 이후, 제출해 보니 테스트 케이스 11번이 실패하였는데 0의 경우를 생각하지 않았다. 정리한 후에 다시 돌려보니 통과할 수 있었다.
function solution(numbers) {
    // map을 이용해 모든 요소를 sort하면서 string으로 바꾼다.
    let arr = numbers.map(el => String(el)).sort((a, b) => b + a - (a + b));
    // 빈 문자열인 result에 다 넣어서 알맞은 형태로 만들어 반환한다.
    let result = "";
    arr.map(el => result += el)
    // 만일, numbers가 전부 0이라면? 의 경우를 생각하여 "000"등이 나오지 않도록 0만 반환한다.
    if(result[0] === "0") return "0"
    return result
}
COMMENT