1. Understand the problem

  • 문제를 자신의 방식으로 다시 말할 수 있는지?
  • 문제에 들어가는 입력 데이터는 무엇인지?
  • 해결책에서 얻을 수 있는 결과는 무엇인지?
  • 문제를 해결할 충분한 정보를 가지고 있는지?
  • 함수나 변수 등의 이름은 어떻게 정할 것인가?

2. Explore examples

  • 간단한 예제로 시작하기
  • 더 복잡한 예제 진행하기
  • 빈 입력값을 가진 예제로 테스트하기
  • 잘못된 입력값을 가진 예제로 테스트하기

3. Break it down

  • 수행해야 할 단계를 명시적으로 기록하기

4. Solve or Simplify

  • 문제를 해결하거나 더 간단한 문제 해결하기

5. Look back and Refactor

  • 결과를 확인할 수 있는지?
  • 결과를 다르게 할 수 있는지?
  • 한번에 코드를 이해할 수 있는지?
  • 다른 문제에서도 결과값이나 함수를 사용할 수 있는지?
  • 수행 시간이 적절한지?
  • 다른 방법으로 문제를 해결할 수 있는지?
  • 다른 사람들은 이 문제를 어떻게 풀었는지?

제출 코드

function solution(answers) {
  let matchCount = new Object();
  const supoza1 = [1, 2, 3, 4, 5];
  const supoza2 = [2, 1, 2, 3, 2, 4, 2, 5];
  const supoza3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];
  for (let i = 0; i < answers.length; i++) {
    let order1 = i % supoza1.length;
    let order2 = i % supoza2.length;
    let order3 = i % supoza3.length;

    if (answers[i] === supoza1[order1]) {
      matchCount[1] = ++matchCount[1] || 1;
    }

    if (answers[i] === supoza2[order2]) {
      matchCount[2] = ++matchCount[2] || 1;
    }

    if (answers[i] === supoza3[order3]) {
      matchCount[3] = ++matchCount[3] || 1;
    }
  }
  let result = whoIsBest(matchCount);
  return result;
}

function whoIsBest(matchCount) {
  let result = new Array();
  let max = Math.max(...Object.values(matchCount));
  for (const [key, value] of Object.entries(matchCount)) {
    if (value === max) {
      result = result.concat(Number.parseInt(key));
    }
  }
  result.sort();
  return result;
}

수포자가 가진 배열 인덱스에 answers 배열 인덱스를 맞추기 위해 나머지 연산(%)을 사용하였습니다.

    let order1 = i % supoza1.length;
    let order2 = i % supoza2.length;
    let order3 = i % supoza3.length;

정답이라면 matchCount Object에 수포자에 해당되는 번호를 key로 하고

1을 더하거나 key가 없을 때는 1로 초기화합니다. 

    if (answers[i] === supoza1[order1]) {
      matchCount[1] = ++matchCount[1] || 1;
    }

whoIsBest 함수는 matchCount Object를 받아 결과값(ex [2,3])을 반환합니다.

function whoIsBest(matchCount) {
  let result = new Array();
  let max = Math.max(...Object.values(matchCount));
  for (const [key, value] of Object.entries(matchCount)) {
    if (value === max) {
      result = result.concat(Number.parseInt(key));
    }
  }
  result.sort();
  return result;
}

Object 가 가진 value 들 중에 가장 큰 값을 max로 선정합니다.

let max = Math.max(...Object.values(matchCount));

Object.entries method를 사용해 key와 value를 얻어내어 

value가 max와 같다면 key를 Number로 바꾸어 result 배열에 추가합니다.

for (const [key, value] of Object.entries(matchCount)) {
    if (value === max) {
      result = result.concat(Number.parseInt(key));
    }
  }

 

Solution with using filter

배열 filter 함수를 사용한 방법

function solution2(answers) {
  let matchCount = new Object();
  const supoza1 = [1, 2, 3, 4, 5];
  const supoza2 = [2, 1, 2, 3, 2, 4, 2, 5];
  const supoza3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];

  matchCount[1] = answers.filter(
    (answer, index) => answer === supoza1[index % supoza1.length]
  ).length;
  matchCount[2] = answers.filter(
    (answer, index) => answer === supoza2[index % supoza2.length]
  ).length;

  matchCount[3] = answers.filter(
    (answer, index) => answer === supoza3[index % supoza3.length]
  ).length;
 
  let result = whoIsBest(matchCount);
  return result;
}

Solution not using Object and fuction whoIsBest

Object와 whoIsBest 메소드를 사용하지 않은 방법

 

function solution(answers) {
  let result = new Array();
  const supoza1 = [1, 2, 3, 4, 5];
  const supoza2 = [2, 1, 2, 3, 2, 4, 2, 5];
  const supoza3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];

  const match1 = answers.filter(
    (answer, index) => answer === supoza1[index % supoza1.length]
  ).length;
  const match2 = answers.filter(
    (answer, index) => answer === supoza2[index % supoza2.length]
  ).length;
  const match3 = answers.filter(
    (answer, index) => answer === supoza3[index % supoza3.length]
  ).length;
  
  let max = Math.max(match1, match2, match3);
  
  [match1, match2, match3].forEach((match, index) => {
    if (match === max) {
      result = result.concat(index + 1);
    }
  });
  
  return result;
}

'코딩 테스트 > 프로그래머스' 카테고리의 다른 글

LEVEL 1 크레인 인형뽑기 게임  (0) 2020.07.02
function charCount(input) {
  if (!input) {
    return {};
  }
  if (typeof input !== 'string') {
    throw new Error('Input is not String');
  }
  let result = new Object();
  //  문자열을 소문자로 바꾸고 문자 단위로 나눈 뒤
  // 소문자이고 숫자인지 정규식을 사용해 필터링하고 정렬합니다.
  let charArray = input
    .toLowerCase()
    .split('')
    .filter((c) => /[a-z0-9]/.test(c))
    .sort();
  for (let i = 0; i < charArray.length; i++) {
    let char = charArray[i];
    result[char] = result.hasOwnProperty(char) ? result[char]++ : 1;
  }
  return result;
}

출력 예시

console.log(charCount('abc'));
// { a: 1, b: 1, c: 1 }
console.log(charCount('c b a a a 1 2 3'));
// { '1': 1, '2': 1, '3': 1, a: 1, b: 1, c: 1 }
console.log(charCount(123));
// Error: Input is not String
console.log(charCount(''));
// {}
console.log(charCount());
// {}
console.log(charCount('Hi, my name is Jinsu!!'));
// { a: 1, e: 1, h: 1, i: 1, j: 1, m: 1, n: 1, s: 1, u: 1, y: 1 }

다른 방식

function charCount2(str) {
  let obj = new Object();
  for (const char of str) {
    char = char.toLowerCase();
    if (/[a-z0-9]/.test(char)) {
      obj[char] = ++obj[char] || 1;
    }
  }
  return obj;
}
let names = ["Michael", "Bab", "Andrea"];
let num = [4, 5, 6, 9, 8, 7, 1, 2, 3, 0, 11, 12, 13, 10];
let values = [true, false, {}, [], 1, "a"];
// [ 'Andrea', 'Bab', 'Michael' ]
// [ [], 1, {}, 'a', false, true ]
// [0, 1, 10, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9];
console.log(names.sort());
console.log(values.sort());
console.log(num.sort());

문자열은 알바벳 순으로 정렬됩니다.

 

배열, 숫자, 객체, 문자열, false, true 순으로 정렬이 됩니다.

 

숫자는 문자열의 유니코드 코드 포인트를 따르기 때문에

1 11 12 2 3 4 순서로 정렬됩니다. 

숫자 순서로 정렬하기 위해서는 sort() 안에 비교 함수를 넣습니다

console.log(num.sort((a, b) => a - b));

/*
오름차순
[
   0,  1, 2, 3,  4,  5,
   6,  7, 8, 9, 10, 11,
  12, 13
]
*/

console.log(num.sort((a, b) => b - a));

/*
내림차순
[
  13, 12, 11, 10, 9, 8,
   7,  6,  5,  4, 3, 2,
   1,  0
]
*/

Map을 이용한 정렬

let list = [
  'korea',
  'Ukraine',
  'Russia',
  'japan',
  'china',
  'America',
  'poland',
  'Rumania',
];

// 임시 배열은 위치 및 정렬 값이있는 객체를 보유합니다.
let mapped = list.map(function (element, index) {
  return { index: index, value: element.toLowerCase() };
});
console.log(mapped);
// 축소 치를 포함한 매핑 된 배열의 소트
mapped.sort(function (a, b) {
  return +(a.value > b.value) || +(a.value === b.value) - 1;
});
console.log(mapped);
// 결과 순서를 위한 컨테이너
let result = mapped.map(function (element) {
  return list[element.index];
});
console.log(result);​
/*
let mapped = list.map(function (element, index) {
  return { index: index, value: element.toLowerCase() };
});
[
  { index: 0, value: 'korea' },
  { index: 1, value: 'ukraine' },
  { index: 2, value: 'russia' },
  { index: 3, value: 'japan' },
  { index: 4, value: 'china' },
  { index: 5, value: 'america' },
  { index: 6, value: 'poland' },
  { index: 7, value: 'rumania' }
]
mapped.sort(function (a, b) {
  return +(a.value > b.value) || +(a.value === b.value) - 1;
});
[
  { index: 5, value: 'america' },
  { index: 4, value: 'china' },
  { index: 3, value: 'japan' },
  { index: 0, value: 'korea' },
  { index: 6, value: 'poland' },
  { index: 7, value: 'rumania' },
  { index: 2, value: 'russia' },
  { index: 1, value: 'ukraine' }
]
let result = mapped.map(function (element) {
  return list[element.index];
});
[
  'America', 'china',
  'japan',   'korea',
  'poland',  'Rumania',
  'Russia',  'Ukraine'
]
*/

[참조]

Array.prototype.sort()

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

수행시간 비교: 기본 for loop < forEach < for of < for in

기본 for loop가 가장 빠릅니다.

 

Example

기본 for loop 사용: 3.799ms
for in loop 사용: 359.135ms
forEach 사용: 21.931ms
for of 사용: 26.932ms

function Loop1(nList) {
  let total = 0;
  for (let i = 0; i < nList.length; i++) {
    total += nList[i];
  }
  return total;
}

function Loop2(nList) {
  let total = 0;
  for (const num in nList) {
    total += num;
  }
  return total;
}

function Loop3(nList) {
  let total = 0;
  nList.forEach((num) => {
    total += num;
  });
  return total;
}

function Loop4(nList) {
  let total = 0;
  for (const num of nList) {
    total += num;
  }
  return total;
}

let n = 1000000;
let nList = new Array();
for (let i = 1; i <= n; i++) {
  nList.push(i);
}

console.time("기본 for loop 사용");
Loop1(nList);
console.timeEnd("기본 for loop 사용");

console.time("for in loop 사용");
Loop2(nList);
console.timeEnd("for in loop 사용");

console.time("for Each 사용");
Loop3(nList);
console.timeEnd("for Each 사용");

console.time("for of 사용");
Loop4(nList);
console.timeEnd("for of 사용");

1. forEach 문은 배열에서만 사용이 가능합니다.

2. for in 문은 모든 객체에서 사용이 가능하지만 key에만 접근합니다. value는 key를 사용해 접근해야 합니다.

3. for of 문은 컬렉션 개체가 [Symbol.iterator] 속성]을 가져야 합니다.

let sample = [1, 2, 3, 4, 5];
sample.Case = "I'am in the Cafe";

for (const key in sample) {
  if (sample.hasOwnProperty(key)) {
    console.log(key, sample[key]);
  }
}

// 0 1
// 1 2
// 2 3
// 3 4
// 4 5
// Case I'am in the Cafe

for (const iterator of sample) {
  console.log(iterator);
}

// 1
// 2
// 3
// 4
// 5

'코딩 테스트 > 알고리즘' 카테고리의 다른 글

Problem Solving Approach  (0) 2020.07.09
자바스크립트. 문자 세기  (0) 2020.07.08
자바스크립트. 정렬 순서  (0) 2020.07.04
Analyzing Performance of Arrays and Objects  (0) 2020.07.04
Big O Notation  (0) 2020.07.02

Big O of Objects

  1. 삽입 O(1)
  2. 제거 O(1)
  3. 탐색 O(n)
  4. 접근 O(1)

Big O of Object mehtods

  1. Object.keys() O(n)
  2. Object.values() O(n)
  3. Object.entries() O(n)
  4. Object.hasOwnProperty("키 이름") O(1)

Big O of Arrays

  1. 탐색 O(n)
  2. 접근 O(1)

Big O of Array methods

  1. push O(1)
  2. pop O(1)
  3. shift O(n)
  4. unshift O(n)
  5. concat O(n)
  6. slice O(n)
  7. splice O(n)
  8. sort O(nlogn)
  9. forEach/map/filter/reduce 등 O(n)

'코딩 테스트 > 알고리즘' 카테고리의 다른 글

Problem Solving Approach  (0) 2020.07.09
자바스크립트. 문자 세기  (0) 2020.07.08
자바스크립트. 정렬 순서  (0) 2020.07.04
자바스크립트. for 반복문 수행시간 비교  (0) 2020.07.04
Big O Notation  (0) 2020.07.02
var runningSum = function (nums) {
  let sum = 0;
  let result = new Array();
  for (let i = 0; i < nums.length; i++) {
    sum += nums[i];
    result.push(sum);
  }
  return result;
};

Input: nums = [1,2,3,4]

Output: [1,3,6,10]

Explanation: Running sum is obtained as follows: [1, 1+2, 1+2+3, 1+2+3+4]

 

Input: nums = [1,1,1,1,1]

Output: [1,2,3,4,5]

Explanation: Running sum is obtained as follows: [1, 1+1, 1+1+1, 1+1+1+1, 1+1+1+1+1]

 

반복문을 사용해 num 값들을 sum에 차례대로 더해준다.

더해줄 때마다 sum을 result 배열에 담아준다.

'코딩 테스트 > LeetCode' 카테고리의 다른 글

Easy) 1512. Number of Good Pairs  (0) 2020.09.15
Easy) 1108. Defanging an IP Address  (0) 2020.09.15
Easy) 771. Jewels and Stones  (0) 2020.09.15
Easy) Shuffle the Array  (0) 2020.09.13
Easy) Kids With the Greatest Number of Candies  (0) 2020.09.13
function solution(board, moves) {
  let answer = 0;
  let basket = new Array();
  for (let i = 0; i < moves.length; i++) {
    let pick = moves[i] - 1;
    let doll = 0;
    for (let j = 0; j < board.length; j++) {
      if (board[j][pick] > 0) {
        doll = board[j][pick];
        board[j].splice(pick, 1, 0);
        break;
      }
    }

    if (doll > 0) {
      basket.push(doll);
    }
    if (basket.length > 1) {
      let last = basket[basket.length - 1];
      let beforeLast = basket[basket.length - 2];
      if (last === beforeLast) {
        basket.splice(basket.length - 2, 2);
        answer += 2;
      }
    }
  }
  return answer;
}

let board = [
  [0, 0, 0, 0, 0],
  [0, 0, 1, 0, 3],
  [0, 2, 5, 0, 1],
  [4, 2, 4, 4, 2],
  [3, 5, 1, 3, 1],
];

let moves = [1, 5, 3, 5, 1, 2, 1, 4];

basket: 뽑은 인형을 담는 배열

pick: moves 배열 값으로 선택되는 세로축 번호

doll: 뽑은 인형 번호, 0은 빈 공간


for (let j = 0; j < board.length; j++) {
  if (board[j][pick] > 0) {
    doll = board[j][pick];
    board[j].splice(pick, 1, 0);
    break;
  }
}​

board.length는 인형뽑기 깊이를 의미합니다. 인형 번호가 1 이상이고 빈 공간이 0입니다.

board[j][pick]가 0보다 큰 경우는 인형이 있다는 것이고 doll에 인형 번호를 줍니다.

그리고 splice 함수를 이용해 인형이 있던 자리값을 0으로 바꾸어 줍니다.

인형을 뽑았기 때문에 반복문을 종료합니다.

 if (doll > 0) {
   basket.push(doll);
 }

board에서 인형을 뽑을 때 pick이 지정한 세로축에 인형이 없을 수도 있습니다!!

그러면 doll은 0인 상태인지 확인하고 basket에 인형을 담습니다.

    if (basket.length > 1) {
      let last = basket[basket.length - 1];
      let beforeLast = basket[basket.length - 2];
      if (last === beforeLast) {
        basket.splice(basket.length - 2, 2);
        answer += 2;
      }
    }

basket에 둘 이상이 있어야 뽑은 인형과 바로 전에 뽑은 인형을 비교할 수 있습니다.

방금 뽑은 인형과 이전에 뽑은 인형을 비교해 같다면

basket에서 이 둘을 splice를 이용해 제거합니다. 그리고 두 인형이 제거되었으므로 answer에 2를 더해줍니다.

'코딩 테스트 > 프로그래머스' 카테고리의 다른 글

Level 1 모의고사  (0) 2020.07.08

+ Recent posts