"나는 무엇을 풀었는가" 시리즈는 이렇게 시작했습니다.

  1. 취업 준비 중 몇 번의 코딩테스트를 보며 깨달은 것이 있다. 바로 기초가 중요하다. 그리하여 프로그래머스 Level.0부터 차근차근 다시 풀어보려고 한다.
  2. 단지 문제를 푸는 것보단, 왜 해당 함수를 썼는지 더 재사용이나 가독성을 높일 방법은 없는지, 그리고 해당 함수가 없다면 어떻게 풀 수 있을지와 같이 다양한 방법과 생각을 통해 사고력을 높이려고 한다.
  3. 그럼 레츠 고 !

👉 나는 무엇을 풀었는가? [7월 첫주 上편]에 이어서...

1. [해커랭크] Time Convension

문제설명 : 12시간제 형식을 24시간제 형식으로 변환하여 리턴하세요.

  • 12시간제 12:00:00AM은 24시간제 00:00:00입니다.
  • 12시간제 12:00:00PM은 24시간제 12:00:00입니다.

입/출력 :

console.log(timeConversion(07:05:45PM)) // 19:05:45

Solution1

  • 구조분해할당을 통해 오전/오후 상태, 시간, 분+초값을 받아와 변수에 할당한다.
  • day(오전/오후 상태)가 'PM' 일때 시간이 12시가 아니라면 24시로 바꿔준다.
  • day가 'AM'이고 시간이 12시라면 00시로 바꿔준다.
function timeConversion(s) {
  let [day, time, minSec] = [s.slice(8, 10), s.slice(0, 2), s.slice(3, 8)];

  if (day === "PM") {
    if (time !== "12") time = 12 + (+time);
  } else {
    if (time === "12") time = '00';
  }

  return `${time}:${minSec}`;
}

Solution2

function timeConversion(s) {
    s = s.split(''); // 배열
    const day = s.splice(8, 10).join('');
    const [hh, mm, ss] = s.join('').split(':');
    let nowTime = hh;

    if (day === "PM") {
        if (hh !== "12") nowTime = 12 + Number(hh);
    } else {
        if (hh === "12") nowTime = '00';
    }

    return `${nowTime}:${mm}:${ss}`;
}

2. [해커랭크] Sparse Arrays

문제설명 : 두 번째 인자로 받는 queries의 각 요소가 strings에 몇번 들어있는지 세어 각 요소의 반복 횟수를 담은 배열을 리턴하세요.

입/출력 :

console.log(matchingStrings([4, 아바, 바바, 아바 xzxb], [3, 아바, xzxb, ab])) // [2, 1, 0]

Solution1

  • queries에 map을 돌려 각 요소를 확인한다.
  • 각 요소에 filter를 해 queries의 각 요소와 strings의 각 요소가 일치하는 수를 length로 리턴한다.
function matchingStrings(strings, queries) {
  return queries.map(query => strings.filter(
    string => query === string).length
  )
}

3. [해커랭크] Sales by Match

문제설명 : 배열의 각 숫자는 양말의 색상을 나타낼 때, 각 색상이 일치하는 양말이 총 몇컬레 있는지 리턴하세요. 이때 한 켤레 당 양말 2개입니다.

  • n은 총 n의 갯수를 의미합니다.

입/출력 :

console.log(sockMerchant(7, [1, 2, 1, 2, 1, 3, 2])); // 2

Solution1

  • 양말 배열을 오름차순으로 정렬한다.
  • 왼쪽부터 첫번째 요소와 두번째 요소의 값이 같다면 횟수를 +1해주고, 두 요소 모두 배열에서 제거한다.
  • 일치하지 않는다면 첫번째 요소만 제거한다.
  • 모든 요소를 점검한 후 총 횟수를 리턴한다.
function sockMerchant(n, ar) {
  let pair = 0;
  ar.sort();

  while (ar.length > 0) {
    if (ar[0] === ar[1]) {
      pair++;
      ar.shift();
      ar.shift();
    } else {
      ar.shift();
    }
  }
  return pair;
}

4. [프로그래머스] n번째 원소까지

문제설명 : num_list의 첫 번째 원소부터 n 번째 원소까지의 모든 원소를 담은 리스트를 리턴하세요.

입/출력 :

console.log(solution([2, 1, 6], 1)); // [2]

Solution1

function solution(num_list, n) {
  return num_list.slice(0, n);
}

5. [해커랭크] Counting Sort1

문제설명 : 항상 100개의 요소가 있는 배열이 주어지면, 배열의 각 요소가 존재하는 횟수를 세어 요소를 횟수로 바꿔 리턴하세요.

Solution1

function countingSort(arr) {
  // 100개의 요소가 있는 새 배열을 만들고 초기값으로 0을 채운다.
  let resultArr = new Array(100).fill(0);
    
  // 그리고 for 루프를 통해 원래 배열인 arr를 돌면서 resultArr의 인덱스 숫자를 1씩 증가시킨다.
  for (let i of arr) {
    resultArr[i]++;
  }
    
  return resultArr;
}

Solution2

  • 배열의 범위가 항상 100이 아닐 때
  • fill() 함수를 코드로 구현해보았다.
function countingSort(arr) {
  let resultArr = [];
  for (let i = 0; i < 100; i++) {
    resultArr.push(0);
  }
    
  // 그리고 for 루프를 통해 원래 배열인 arr를 돌면서 resultArr의 인덱스 숫자를 1씩 증가시킨다.
  for (let i of arr) {
    resultArr[i]++;
  }
    
  return resultArr;
}

6. [해커랭크] Diagonal Difference

문제설명 : 2차원 배열의 좌측 상단에서 우측 하단의 대각선 요소들을 더한 값에서 우측 상단에서 좌측 하단의 대각선 요소들을 더한 값을 뺀 절대값을 리턴하세요.

입/출력 :

console.log(([[1, 2, 3], [4, 5, 6], [9, 8, 9]])) // 2

Solution1

  • leftToRight : 맨 왼쪽 상단(0,0)에서 맨 오른쪽 하단 (n, n)까지
    → 따라서 row와 column의 인덱스가 같은 값들을 반복문을 돌면서 더한다.
  • RightToLeft : 맨 오른쪽 상단 (0, n)에서 맨 왼쪽 하단 (n, 0)까지
    → 반복문을 돌면서 row 인덱스 값은 증가하고, column은 [(배열 길이-1) - (row 인덱스 값)]만큼 감소시키며 더해준다.
  • leftToRight - RightToLeft 값의 절대값을 리턴한다.
function diagonalDifference(arr) {
  const n = arr.length;
  let leftToRight = 0;
  let rightToLeft = 0;
  
  for (let i = 0; i < n ; i++) {
      leftToRight += arr[i][i];
      rightToLeft += arr[i][(n-1)-i]; // length는 1부터 시작하므로 -1을 해준다.
  } 
  return Math.abs(leftToRight-rightToLeft);
}

Solution2

  • Math.abs 대신 두 값을 뺀 값이 0보다 크면 그대로 리턴, 작으면 음수(-)를 붙여 리턴한다.
function diagonalDifference(arr) {
    const n = arr.length;
    let leftToRight = 0;
    let rightToLeft = 0;
    
    for (let i = 0; i < n ; i++) {
        leftToRight += arr[i][i];
        rightToLeft += arr[i][(n-1)-i]; // length는 1부터 시작하므로 -1을 해준다.
    }
    const result = leftToRight - rightToLeft;
    return result > 0 ? result : -result;
}

7. [프로그래머스] n개 간격의 원소들

문제설명 : num_list의 첫 번째 원소부터 마지막 원소까지 n개 간격으로 저장되어있는 원소들을 차례로 담은 리스트를 리턴하세요.

입/출력 :

console.log(solution([4, 2, 6, 1, 7, 6], 2)); // [4, 6, 7] 

Solution1

  • num_list의 0번째 요소부터 n씩 증가한 요소를 배열로 담아 리턴한다.
function solution(num_list, n) {
  let answer = [];
  
  for (let i = 0; i < num_list.length; i+=n) {
    answer.push(num_list[i]);
  }
  
  return answer;
  }
profile
한입 크기로 베어먹는 개발지식 🍰

0개의 댓글