Coding/Today I Learned (148)

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
 
02
14

너무 과하게 다른거 아닙니까...? 분홍색인거 말고 같은 점이 없네요

1. Next.js?

  • React의 서버 사이드 렌더링(Server Side Rendering)을 도와주는 프레임워크이다.
  • 복잡한 개발 환경을 간단하게 사용할 수 있게 하기 때문에 유리하다.
  • SPA(Single Page Application)으로 이루어진 요즘의 많은 웹 애플리케이션들은 로딩이 오래 걸리기 마련이다. 그때, SSR로 유저들의 UX를 더 끌어올릴 수 있다.

2. SSR vs CSR

  • CSR (Client Side Rendering)
    • 일반적인 React의 렌더링 방식이다.
    • server에서 client 측으로 데이터를 보내면서, html이 거의 비어있는 상태로 보내주기 때문에 검색 시스템에서도 불리하다.
    • 하지만 한 번에 모든 파일을 다운로드해 주기 때문에 페이지 전환이 빠르다.
  • SSR (Server Side Rendering)
    •  server 측에서 미리 랜더링 시킨 후에, 완료된 페이지를 유저에게 보여줄 수 있다.
    • 이미 다 로딩된 상태이므로, 화면을 유저가 보기까지 딜레이가 없다.
    • 그래서 초기 로딩 속도가 빠르다. 하지만 페이지를 이동할 때마다 다시 데이터를 다운로드하기 때문에 페이지 전환이 느릴 수 있다.

3.  어떻게 사용하나요?

  1. npx create-next-app@latest (typescript를 사용하고 싶으면 가장 뒤에 --typescript를 써준다.) 그리고 입력한 후, 프로젝트 이름을 써준다.
  2. npm run dev로 서버를 실행시켜 본다. (react의 npm run start와 같다)
  3. pages 폴더 안에서 파일을 만들어 작업하면 route를 따로 설정하지 않아도 작동이 가능하다!
  4. 초기 페이지인 '홈'은 index.js 파일이 된다.
  5. 나머지는 react에서 작업하듯이 useState와 같은 hook 등을 자유롭게 이용해서 작업하면 된다.

 

 

COMMENT