수강 계기

 

지난 2년간 Web Frontend 개발자로 일하면서 typescript를 주 언어로 사용했습니다.  올해 4월 쯤 C++ 을 주 언어로 사용하는 회사로 이직하면서 빠르게 C++을 학습해야 했습니다. 또 C++ 11 이후의 최신 문법 사용법도 공부가 필요했습니다. 

 

강의를 통해 일반적인 문법 지식을 배우는게 목표면 공식문서나 책을 통해 배우는게 효율적입니다. 강의를 듣게 된다면 단순 문법 지식의 나열이 아닌, 실제로 현업에서 어떻게 쓰이는지, 일반적인 문법 지식이 나왔는지 등등 일반 책에서는 얻기 힘든 깊이있는 지식을 얻을 수 있어야 들어야 한다고 생각합니다.

 

포프님의 유튜브를 평소에도 즐겨봅니다. 영상을 보면서 설명하실 때 단순 지식 나열이 아닌 "왜" 에 대한 논리적인 설명이 항상 따라왔던 것이 정말 좋았습니다. C++ 강의에서도 같은 형태로 "왜" 를 이해하면서 학습할 수 있다면 효율적인 것을 넘어 강의를 잘 듣고 소화시킬 수 있으면 다른 차원의 실력을 가질 수 있을 것 같아 수강했습니다.

 

강의만 들을지, 정규 학기로 수강할지(과제, 시험, 일정관리 포함) 고민했습니다. 가장 큰 제약은 시간이었습니다. 이직한 회사에서 적응하면서 동시에 강의 수강을 해야 했습니다. 왠만한 난이도면 퇴근 후 적당히 공부해서 수강하면 됩니다. 하지만 정규 학기 설명이나 다른 블로그 글에서 "POCU 시험 정말 어렵습니다." 라는 글을 봐서 고민했습니다. 또 무작정 수료만 하면 끝이 아닌 강의였습니다. 최종 점수 85점이 넘지 않으면 Fail 이기 때문에 고민이었습니다.

 

하지만 전체적인 후기에서 실력향상에 큰 도움이 되었다는 글을 많이 봤습니다. 또 빨리 C++ 익숙해져서 회사 SW 개발에 참여해야 하는 상황이라 빡세면 오히려 좋다. 퇴근시간, 주말 정도 강의 수강에 투자하면 충분히 Pass 할 수 있겠다는 생각으로 정규학기를 선택했습니다.

 

수강 전 실력

POCU COMP 3200 수업의 선수 교과목은 
* 2200 : C 언매니지드 프로그래밍

* 2500 : 개체지향 프로그래밍 및 설계(Java)

수업 입니다.

 

C 프로그래밍은 대학생 때 깊이있게 공부를 했었고 COMP 2200 수업도 2년전 쯤 강의로 완강을 했었습니다.

개체지향 프로그래밍 및 설계는 체계적으로 공부한 적은 없고 그 때 그 때 필요하거나 궁금할 때 인터넷 공부로 학습했었습니다. 수강 신청 시점에선 잘 몰랐다고 보면 될 것 같습니다.

 

추가로 백준으로 알고리즘 문제를 풀었었습니다. C++ 언어로 문제를 풀었었고 600개정도 풀어서 solved.ac 기준 플레티넘 5 정도로 점수가 나왔습니다. 

 

고민하신다면

만약 기초 프로그래밍 능력, 포인터와 메모리 관리의 개념이 부족하다면 이 수업 이해와 과제수행하는데 큰 어려움이 있을 것 같다고 생각합니다. 2200 수업을 통해 얻을 수 있는 지식이 없으신 분이 바로 3200을 듣는 걸 고민하신다면 우선 2200 수업을 먼저 마치고 오시는 걸 추천합니다. 

 

개체지향이 무엇인지 모르시는 분은 크게 문제없이 수강 가능하다고 생각합니다. 저도 잘 몰랐지만 수업에서 충분히 언급해주시고 많이 배워갔었습니다. 또 개체지향 개념을 모르는 것 때문에 과제를 못하거나 시험을 치르는데 문제 없었습니다.

 

강의 후기

수업 전반적으로 "왜" 를 충분히 설명해주는 수업이어서 매우 만족했습니다. 평범한 강의는 단순히 기능을 나열하고 그에 대한 딱딱한 설명을 해주고 끝 입니다. 하지만 실제로 현업에서 C++ 을 오래, 제대로 사용하신 포프님께서 현업에서는 어떻게 쓰는지를 알려주니 기억에도 오래남고 수 많은 기능들을 그저 외우는게 아니라 충분히 이해해서 머리에 남길 수 있었습니다. 

 

특히 필요할 때 마다 메모리 구조를 그려주시고 어떤식으로 동작하는지 보여주는 부분이 가장 좋았습니다. 얕은 복사, 깊은 복사, virtual 키워드, 스마트 포인터 등 말로만 설명하면 이해하기 쉽지 않을 텐데 항상 메모리 구조 그림을 동반해서 설명해주십니다. 메모리 그림으로 이해하면 앞으로 모든 코드를 더 자신있게 분석할 수 있을 것 같아 따로 강의 없이도 포프님이 그리셨던 것 처럼 메모리 그림을 그려 분석할 수 있도록 훈련했습니다. 앞으로 코드 분석시 메모리를 시각화해서 더 제대로 이해할 수 있게 된 것 같아 매우 만족합니다. 

 

고민하신다면

C 언어에 대한 이해가 충분히 있으시다면 강의만 수강하셔도 남는 것 많습니다.

특히 만약 C++ 이전 문법은 익숙하고 C++ 11 이후가 궁금해서 듣고 싶은 분이 계신다면 추천 드리고 싶습니다. C++ 11 이후 정말 수 많은 기능이 나왔는데 나온 이유, 제대로 사용하는 방법, 주의해야할 점 등 단순히 강의를 보기만 해도 머리속에 많이 정리가 됐습니다.

개체지향에 대한 이해는 있는데 C++로 구현하는 방법이 궁금하시다면 역시 들으시면 큰 도움 됩니다. 단순히 키워드 설명 뿐만 아니라 특정 개체지향 개념을 C++로 구현하는 방법, 왜 이렇게 구현해야 하는지에 대한 설명이 자세해서 도움이 많이 됩니다. 

 

풀 코스 후기

 

5월 말부터 8월 중순까지 3개월 좀 넘게 코스가 진행됐습니다. 풀 코스에서 수업 수강을 위해 제공되는 건 실습/과제와 자동 채점, 중간/기말 고사, 궁금한 걸 질문하고 답할 수 있는 slack 방 참여가 있습니다.

실습/과제

강의만 봐도 많은 걸 얻을 수 있지만 실습/과제를 통해서 강의의 중요한 부분을 완벽하게 이해할 수 있습니다. 개체지향의 다형성 개념을 강의에서 배웠으면 과제에서 배운 내용을 바탕으로 과제를 수행하는 방식입니다. 단순히 따라 치는 실습/과제를 생각하시면 안됩니다. 주어진 문제에 따라 직접 코드를 구현해서 채점을 받아 만점을 받아야 합니다. 

실제로 구현 해보면서 얻는 건 강의를 보는 것 만큼 얻는 것 만큼이나 많았고 특정 과제는 강의보다 과제를 해결하면서 배우는게 더 많았습니다. 

가장 크게 얻은 것은 메모리 누수 방지 관리 습관, 노하우 였습니다. 초반에서 중반부 실습/과제에서 제가 가장 많이 겪었던 에러, 오답은 메모리 누수가 있는 코드를 작성한 것 입니다. delete 필요한 곳에 잘 해준 것 같은데, 소멸자 잘 호출한 것 같은데 하면서도 2~3시간 코드를 계속 들여다보면 결국 내가 실수한 부분이 있다는 걸 깨닫게 됩니다. 이 경험이 여러번 쌓이니 자주 실수할 수 있는 부분을 많이 경험했고 더 탄탄하게 메모리 관리를 할 수 있게 되었습니다. 이후에 스마트 포인터를 공부하게 되는데 이 과제를 수행하면서는 앞에서 했던 그 섬세한 메모리 관리를 알아서 해주니 너무 좋다. 스마트 포인터를 적극 사용해야겠다 하는 경험적으로 깨닫는 부분이 큽니다. 비싼 가격에 고민하신다면 그 값어치는 충분히 하고 남는다고 추천드리고 싶습니다.

중간/기말 시험

정해진 기간안에 공부했던 내용을 바탕으로 시험을 칠 수 있고 고득점을 하면 수료증을 받을 수 있는 시스템 입니다. 큰 돈을 내고 수강하는 만큼 수료증은 꼭 받고 싶은데 이 때문에 공부를 더 열심히 할 수 있는 동기부여가 됩니다.

 

중간/기말 시험을 준비하면서 그동안 공부했던 내용을 다시 강제로(?) 정리하고 복습할 수 있는 시간을 가질 수 있습니다. 시험 난이도는 충분히 어렵기 때문에 대충 공부하면 안되고 충분한 이해를 하도록 깊이있게 공부해야 했습니다. 너무 쉬웠다면 크게 얻는 게 없었을 것 입니다.

 

수료도 하고 싶었고 이왕이면 고득점을 받고 싶어서 열심히 했던 것 같습니다. 보통 시험엔 운이 작용한다고 생각하는데 포큐 시험은 충분히 실력으로 평가받을 수 있도록 잘 만들어져 있으니 시간만 충분히 투자하신다면 공부 충분히 하시고 고득점 받을 수 있습니다. 

slack 방 운영

질문을 하면 포큐님이 직접 답변 하실 때도 많고 조교, 다른 수강생끼리 서로 질문 답변 하며 많은 걸 배울 수 있습니다. 배웠던 개념에 대해 이야기하는 경우도 많고 실습/과제 힌트도 많이 얻을 수 있습니다. 특히 공부를 깊게 하시는 분들이 많이 계신데 하시는 질문/답변을 통해서 정말 많이 배울 수 있습니다. 

 

고민하신다면

실습은 보통 강의에 나와있는 부분을 잘 참고하면 어렵지 않게 해결할 수 있습니다. 저는 과제 당 평균 3~4시간 정도를 사용했습니다. 2시간 이내에 끝나는 쉬운 과제도 있고 5시간 이상 쓴 어렵고 복잡한 과제도 있었습니다. 혼자서 해결하기 너무 어렵다면 slack 방 질문을 통해 힌트를 얻을 수도 있습니다. 결국 시간 충분히 쓰고 끝까지 해내려고 하면 실습 100점은 모두 받으실 수 있다고 생각합니다.

 

과제는 그보다 더 어렵습니다. 총 4개가 나오는데 개체지향 개념을 다루는 2번 과제가 특히 어렵게 느껴졌습니다. 이 과제는 3주동안 해결하면 되는데 10시간 넘게 걸렸던 것 같습니다. 다른 과제도 5시간 이상씩은 모두 걸렸습니다.

 

과제나 실습은 하면서 괴롭기 보단 재밌습니다. 채점 봇을 통해 실시간으로 채점 받고 틀린 부분을 알 수 있습니다.
코드 수정하고 채점 받고 하는 과정이 재밌게 느껴졌습니다. 시간 압박 없이 미리 여유롭게 하신다면 즐겁게 하실 수 있습니다.

시험문제는 지엽적이고 필요없을 것 같은 건 나오지 않습니다. 수업, 과제에서 중요하게 다루었던 부분이 비중있게 나옵니다. 시험을 치면서 못 풀었던 문제들을 통해 제대로 이해하지 못한 부분을 파악할 수 있습니다.

시험도 단순히 어느 강의부터 어느 강의까지 이런 것이 아닌 시험 1~2주 전 나오는 개념을 다 나열해주시고 연습문제까지 제공해 주십니다. 그래서 어디를 집중해서 공부해야할 지 명확하기 때문에 즐겁게 공부할 수 있습니다. 수강 신청하면서 시험이 가장 걱정이었지만 범위와 주제가 명확하기 때문에 크게 걱정 안하셔도 됩니다.

 

추천합니다.

시간이 충분하고 깊게 공부하는 것 좋아하시는 분이시면 후회없는 선택입니다. 생각했던 것 보다도 더 깊이 배웠고 좋은 예시와 설명으로 쉽게 이해했습니다.

하지만 보통 직장인이든 대학생이든 시간이 부족한데요. 그래도 추천합니다. 저는 대부분 이동할 때 강의를 시청했었고 과제 수행시 어려울 때 다시 한번 보고 시험 전 시험나오는 부분 2배속으로 한번 보는 식으로 코스를 수강했는데 어느정도 C언어 이해가 있는 상황에선 충분히 따라갈 만 했습니다. 

수강을 고민하시는 분들께 도움이 됐으면 좋겠습니다😊

문제

https://app.codility.com/programmers/lessons/14-binary_search_algorithm/min_max_division/

풀이

블럭을 몇번 나눌 지를 이분 탐색으로 찾는다.

  1. 나올 수 있는 가장 최고의 경우는 원소 길이만큼 나누는 것 -> 배열의 최대값이 최소값
  2. 나올 수 있는 가장 큰 값은 배열 모든 원소의 합
  3. 이분 탐색으로 나올 수 있는 값을 정해가면서 block 몇개로 나누어지는지 체크 후 주어진 K만큼 나눌 수 있을 때가 정답

코드


function getBlocks(A, midValue) {
  let blocks = 1;
  let subSum = 0;
  A.forEach((el) => {
    if (subSum + el > midValue) {
      blocks += 1;
      subSum = el;
    } else {
      subSum += el;
    }
  })
  return blocks;
}

function solution(K, M, A) {
  // write your code in JavaScript (Node.js 8.9.4)
  let minValue = A.reduce((acc, el) => {
    return Math.max(acc, el);
  }, 0);

  let maxValue = A.reduce((acc, el) => {
    return acc + el;
  }, 0);

  while (minValue < maxValue) {
    let midValue = parseInt((minValue + maxValue) / 2, 10);
    let blocks = getBlocks(A, midValue);
    if (blocks > K) {
      minValue = midValue + 1;
    } else {
      maxValue = midValue;
    }
  }

  return minValue;
}

문제

https://app.codility.com/programmers/lessons/5-prefix_sums/min_avg_two_slice/

풀이

  1. 두 수의 평균은 두 수 중 작은 수보다 크거나 같다(같은 경우는 두 수가 같을 때)
  2. 이를 3개 이상의 N개의 수가 있다고 할 때 두 그룹으로 나눈다면 N개의 수의 평균은 두 그룹 중 합이 작은 것 보다 무조건 크기 때문에 N이 4개인 것이 답이 될 수 없다.
  3. 2개, 3개인 경우일 때 최소이므로 이 경우만 다 구해보면 답을 구할 수 있다.

코드

function solution(A) {
    let minAvg = (A[0] + A[1]) / 2;
    let minIdx = 0;
    for(let i=2;i<A.length;++i) {
        let avg = (A[i-2] + A[i-1] + A[i]) / 3;
        if(minAvg > avg) {
            minAvg = avg;
            minIdx = i-2;
        }
        avg = (A[i-1] + A[i]) / 2;
        if(minAvg > avg) {
            minAvg = avg;
            minIdx = i-1;
        }
    }
    return minIdx;
}

문제

app.codility.com/programmers/lessons/9-maximum_slice_problem/max_double_slice_sum/

 

풀이

첫번째 생각

  1. 전체의 부분합을 구한다.
  2. A, C 를 뽑는 모든 경우의 수를 구해서 계산한다.
  3. 부분합[C-1] - 부분합[A] 으로 A+1 ~ C-1 까지의 부분합 구한 후 이 사이를 B라고 생각하고 하나씩 빼보면서 답을 구한다.

=> A, C를 뽑는 조합은 nC2 로 N제한이 10만이어서 10만 * 10만 으로 쉽게 시간초과가 날 것 같다.

두번째 생각

  1. 왼쪽에서 오른쪽 방향으로 Largest Sum Contiguous Subarray 을 구한다.
  2. 오른쪽에서 왼쪽 방향으로 Largest Sum Contiguous Subarray 을 구한다.
  3. B를 2~C-1이라고 생각하고 B-1까지 왼쪽에서 오른쪽방향의 LSCS 가 계산하고 B+1에서 N-1까지 오른쪽에서 왼쪽 방향으로 LSCS가 계산해서 for문을 한번 돈다.

=> 이렇게 하면 B를 지정해주는 for문만 돌면 되므로 O(N)만에 해결할 수 있었다.

코드

function solution(A) {
  let increaseArray = new Array(A.length).fill(0);
  let decreaseArray = new Array(A.length).fill(0);

  for (let i = 1; i < A.length - 1; ++i) {
    increaseArray[i] = Math.max(increaseArray[i - 1] + A[i], 0);
  }
  for (let i = A.length - 2; i > 0; --i) {
    decreaseArray[i] = Math.max(decreaseArray[i + 1] + A[i], 0);
  }
  let ans = -9999999;

  for (let i = 1; i < A.length - 1; ++i) {
    ans = Math.max(increaseArray[i - 1] + decreaseArray[i + 1], ans);
  }
  return ans;
}

문제

https://www.acmicpc.net/problem/9184

풀이

정의대로 코드 작성한 후 메모이제이션 한다.

코드

let fs = require('fs');
// let input = fs.readFileSync('/dev/stdin').toString().split('\n');
let input = fs.readFileSync('./b9184.txt').toString().split('\n');

let readlineIdx = 0;

const readInput = () => input[readlineIdx++];

const fillMax = 0;
let table = new Array(21);

function w(a, b, c) {
  if (a <= 0 || b <= 0 || c <= 0) {
    return 1;
  }

  if (a > 20 || b > 20 || c > 20) {
    return w(20, 20, 20);
  }

  if (table[a][b][c] !== fillMax) {
    return table[a][b][c];
  }

  if (a < b && b < c) {
    let t1 = table[a][b][c - 1] = w(a, b, c - 1);
    let t2 = table[a][b - 1][c - 1] = w(a, b - 1, c - 1);
    let t3 = table[a][b - 1][c] = w(a, b - 1, c);
    return table[a][b][c] = t1 + t2 - t3;
  }


  let t1 = table[a - 1][b][c] = w(a - 1, b, c);
  let t2 = table[a - 1][b - 1][c] = w(a - 1, b - 1, c);
  let t3 = table[a - 1][b][c - 1] = w(a - 1, b, c - 1);
  let t4 = table[a - 1][b - 1][c - 1] = w(a - 1, b - 1, c - 1);
  return table[a][b][c] = t1 + t2 + t3 - t4;

}

function main() {
  for (let i = 0; i < 21; ++i) {
    table[i] = new Array(21);
    for (let j = 0; j < 21; ++j) {
      table[i][j] = new Array(21).fill(fillMax);
    }
  }
  while (true) {
    let [a, b, c] = readInput().split(' ');
    a = Number(a);
    b = Number(b);
    c = Number(c);
    if (a === -1 && b === -1 && c === -1) break;
    console.log(`w(${a}, ${b}, ${c}) = ${w(a, b, c)}`);

  }
}

main();

문제

https://www.acmicpc.net/problem/1913

풀이

1, 1 부터 시작해서 반시계방향으로 배열 만들어 간다.
만들다가 해당 숫자 나오면 좌표를 기록한다.
배열이 완성되면 배열과 좌표를 출력한다.

코드

let fs = require('fs');
// let input = fs.readFileSync('/dev/stdin').toString().split('\n');
let input = fs.readFileSync('./b1913.txt').toString().split('\n');

let readlineIdx = 0;

const readInput = () => input[readlineIdx++];

let dx = [0, 1, 0, -1];
let dy = [1, 0, -1, 0];
let answerLoca = { X: 0, Y: 2 };
function solution(table, t) {
  let cnt = t * t;
  let X = 0;
  let Y = 0;
  let nowDir = 0;
  let moveCnt = t;
  while (true) {
    if (nowDir === 1) {
      moveCnt--;
    }
    if (nowDir === 3) {
      moveCnt--;
    }

    for (let i = 0; i < moveCnt; ++i) {
      X = X + dx[nowDir];
      Y = Y + dy[nowDir];
      table[X][Y] = cnt--;
      if (table[X][Y] === findNum) {
        answerLoca = { X, Y };
      }
    }


    if (cnt === 0) {
      return;
    }
    nowDir = (nowDir + 1) % 4;
  }
}

let findNum;
function main() {
  let t = readInput();
  t = parseInt(t, 10);
  findNum = parseInt(readInput(), 10);
  let table = new Array(t + 1);
  for (let i = 0; i < t + 1; ++i) {
    table[i] = new Array(t).fill(0);
  }
  solution(table, t);
  for (let y = 1; y < t + 1; ++y) {
    let string = "";
    for (let x = 0; x < t; ++x) {
      if (x === t - 1) {
        string += table[x][y];
        break;
      }
      string += table[x][y] + ' ';
    }
    console.log(string);
  }
  console.log(answerLoca.Y, answerLoca.X + 1);

}

main();

문제

https://www.acmicpc.net/problem/5052

풀이

trie 자료구조에 입력값을 저장한다.
trie를 구성하던 중에 trie완성된 부분에서 node를 추가해나가는 건 다른 접두사가 있다는 것으로 "NO" 출력
trie를 구성하던 중에 끝났는데 지금까지 구성된 trie가 있다면 (this.pass로 표현) "NO" 출력

코드

let fs = require('fs');
// let input = fs.readFileSync('/dev/stdin').toString().split('\n');
let input = fs.readFileSync('./input.txt').toString().split('\n');

let readlineIdx = 0;

const readInput = () => input[readlineIdx++];

class Trie {
  constructor() {
    this.pass = false;
    this.end = false;
    this.child = {};
  }

  insert(trie, arr) {
    let el = parseInt(arr[0], 10);
    const nowChild = trie.child[el];
    if (nowChild === undefined) {
      const nT = new Trie();
      nT.pass = true;
      trie.child[el] = nT;
      if (arr.length === 1) {
        nT.end = true;
        return true;
      }
      return this.insert(nT, arr.slice(1));

    }
    if (nowChild.end === true) {
      return false;
    }
    if (arr.length === 1) {
      if (nowChild.pass) {
        return false;
      }
      nowChild.pass = true;
      nowChild.end = true;
      return true;
    }
    nowChild.pass = true;
    return this.insert(nowChild, arr.slice(1));
  }
}

function solution(temparr, n) {
  const trie = new Trie();
  for (let i = 0; i < n; ++i) {
    const nowArr = temparr[i].split("").filter((el) => el !== ' ');
    if (trie.insert(trie, nowArr) === false) {
      return false;
    }
  }
  return true;
}

function main() {
  let t = readInput();
  while (t--) {
    let n = readInput();
    let temparr = new Array();
    for (let i = 0; i < n; ++i) {
      temparr.push(readInput());
    }
    console.log(solution(temparr, n) === true ? 'YES' : 'NO');
  }
}

main();

문제

www.hackerrank.com/challenges/new-year-chaos/problem?h_l=interview&playlist_slugs%5B%5D%5B%5D=interview-preparation-kit&playlist_slugs%5B%5D%5B%5D=arrays&isFullScreen=true

풀이

  1. arr[i] = i+1 형태의 배열을 만든다.
  2. 이 배열을 입력배열 q와 똑같이 만들 수 있는지 판별하고 swap cnt를 기록한다.
  3. idx=0부터 증가하면서 조건을 만족하며 swap해 가면 반드시 본래위치에 idx+2 이하에 들어가야 하는 값이 있어야 한다.
  4. 조건 만족하면 cnt기록, 조건만족하지 않으면 종료시킨다.

코드

'use strict';

process.stdin.resume();
process.stdin.setEncoding('utf-8');

let inputString = '';
let currentLine = 0;

process.stdin.on('data', inputStdin => {
    inputString += inputStdin;
});

process.stdin.on('end', _ => {
    inputString = inputString.replace(/\s*$/, '')
        .split('\n')
        .map(str => str.replace(/\s*$/, ''));

    main();
});

function readLine() {
    return inputString[currentLine++];
}

// Complete the minimumBribes function below.
function minimumBribes(q) {
  let answer = 0;
  let arr = Array(100001);
  let arrCnt = Array(100001);
  for(let i=0;i<arr.length;++i) {
    arr[i] = i+1;
  }
  for(let i=0;i<q.length-1;++i) {
    let originValue = q[i];
    if(arr[i] !== originValue) {
      if(arr[i+1] !== originValue) {
        if(arr[i+2] !== originValue) {
          return 'Too chaotic';
        }
        let temp = arr[i+2];
        arr[i+2] = arr[i+1];
        arr[i+1] = temp;
        answer++;
      }
      let temp = arr[i+1];
      arr[i+1] = arr[i];
      arr[i] = temp;
      answer++;


    }
  }
  return answer;
}

function main() {
    const t = parseInt(readLine(), 10);

    for (let tItr = 0; tItr < t; tItr++) {
        const n = parseInt(readLine(), 10);

        const q = readLine().split(' ').map(qTemp => parseInt(qTemp, 10));

        console.log(minimumBribes(q));
    }
}

문제

https://programmers.co.kr/learn/courses/30/lessons/17677

풀이

  1. str1의 길이가 str2보다 짧으면 둘을 swap한다.
  2. 입력받은 문자열을 대문자로 바꾼다.
  3. 2글자씩 나누어 배열에 담는다.
  4. 2글자씩 나누었을 때 부적절한 단어가 있으면 drop 한다.
  5. 교집합과 합집합의 수를 구하기 위해 str1을 새로운 배열에 넣고 그곳에 str2의 원소를 하나씩 넣으며 교집합의 원소개수와 합집합 원소개수를 구한다.
  6. 값을 구한다.

문제

https://programmers.co.kr/learn/courses/30/lessons/12899?language=javascript#

풀이

  1. 3진수를 만든다.
  2. 3진수의 0이 있으면 윗자리 수에서 3을 빌려와서 3을 더해준다.

코드

function solution(n) {
  var answer = '';
  let tempans = Array();
  while(n > 0) {
    tempans.push(n % 3);
    n = Math.floor(n / 3);
  }
  for(let i=0;i<tempans.length-1;++i) {
    if(tempans[i] <= 0) {
    tempans[i] += 3;
    tempans[i+1]--;
    } 
  }

  tempans.reverse()
    .forEach((el) => {
      if(el === 0) {
        return;
      }
      if(el === 3) {
        answer += '4';
        return;
      } 
      answer += el;
    })
  return answer;
}

'알고리즘' 카테고리의 다른 글

[HackerRank] New Year Chaos  (0) 2021.01.08
[프로그래머스] 뉴스클러스터링  (0) 2021.01.07
백준 20055 C++ 컨베이어 벨트 위의 로봇  (0) 2020.12.31
Codility - MinAbsSumOfTwo  (0) 2020.12.30
백준 4902 삼각형의 값 c++  (0) 2020.09.17

+ Recent posts