11일차 - 알고리즘

개발 log·2021년 7월 22일
0

TIL

목록 보기
8/21

1일차 과제


중복 문자 제거

중복을 허용하지 않는 Set을 이용하여 해결

function solution(str) {
  return Array.from(new Set(str)).join("");
}

console.log(solution("ksekkset"));

회문 문자열

입력 받은 str을 배열화 시킨 후
배열의 길이가 1이 넘으며 pop 반환값과 shift 반환값이 일치하지 않으면 NO를 출력하고
그렇지 않으면 YES를 출력하여 해결

let str = "yeeeeeeeeeeeeeeey";

function solution(str) {
  let arr = str.split("");

  while (arr.length > 1) {
    if (arr.pop().toUpperCase() !== arr.shift().toUpperCase()) {
      return "NO";
    }
  }
  return "YES";
}

console.log(solution(str));

뒤집은 소수

map 함수를 이용하여 뒤집힌 자연수로 이루어진 배열 생성
filter 함수를 이용하여 소수판별식을 통해 answer배열 생성
answer 반환하여 해결


let nums = [32, 55, 62, 20, 250, 370, 200, 30, 100, 0];

function solution(nums) {
  let arr = nums.map((n) => {
    return parseInt(n.toString().split("").reverse().join(""));
  });

  let answer = arr.filter((n) => {
    if (n === 1 || n === 0) {
      return false;
    } else if (n === 2) {
      return true;
    }
    for (let i = 2; i < n; i++) {
      if (n % i === 0) {
        return false;
      }
    }
    return true;
  });

  return answer;
}

console.log(solution(nums));

괄호 문자 제거

입력받은 str을 배열화 시킨 후
"("를 카운트하는 변수와 ")"를 카운트하는 변수 생성
배열을 돌리며 "(",")"카운트가 0일때
배열안의 값이 "("이면 카운트를 올리고 그렇지 않으면 정답배열에 해당 값 추가
다시 돌리며 만약 "(",")"카운트가 0이 아니면서 같을때
배열안의 값을 정답배열에 추가 후 카운트 초기화
다시돌리며 만약 "(",")"카운트가 0이 아니며, 같지 않을때
배열안의 값이 ")"이라면 ")"카운트를 올리고
그렇지 않고 "("이면 "("카운트를 올린다
최종으로 answer 배열의 값들을 join하여 반환한다

let str = "(A(BC)D)EF(G(H)(IJ)K)LM(N)";

function solution(str) {
  let answer = [];
  let cnt1 = 0;
  let cnt2 = 0;

  str.split("").forEach((s) => {
    if (cnt1 === 0 && cnt2 === 0) {
      if (s === "(") {
        cnt1 += 1;
      } else {
        answer.push(s);
      }
    } else if (cnt1 === cnt2) {
      answer.push(s);
      cnt1 = 0;
      cnt2 = 0;
    } else if (cnt1 !== 0) {
      if (s === ")") {
        cnt2 += 1;
      } else if (s === "(") {
        cnt1 += 1;
      }
    }
  });
  return answer.join("");
}

console.log(solution(str));

재귀함수를 이용한 이진수 출력

재귀함수의 재귀 구문에 n의 몫을 재귀로 받는 함수에 n의 나머지를 문자열로 변환하여 합치는 구문 작성
종료되면 ''반환

let n = 95;

function solution(n) {
  // 종료 구문
  if (n === 0) {
    return "";
  }
  // 재귀 구문
  return solution(parseInt(n / 2)) + String(n % 2);
}

console.log(solution(n));


2일차 과제


대문자 찾기

str를 배열화 시켜
filter함수로 돌리며 값이 대문자화한 값과 같은지 확인하여 배열생성
배열의 길이 출력

let str = "KoreaTimeGood";

function solution(str) {
  return str.split("").filter((e) => e === e.toUpperCase()).length;
}

console.log(solution(str));

대소문자 변환

str를 배열화 시켜 map함수로 돌리며
삼항연산자를 통해 값이 값을 대문자화한 값과 같다면 소문자화 시키고
그렇지 않다면 대문자화 시켜 반환

let str = "gattBG";

function solution(str) {
  return str
    .split("")
    .map((e) => (e === e.toUpperCase() ? e.toLowerCase() : e.toUpperCase()))
    .join("");
}

console.log(solution(str));

가위바위보

가위바위보가 숫자화되어 있다는 점을 이용하여
상대가 될 B의 1: 가위에 3을 추가한 뒤
forEach함수를 이용하여 A값과 B값을 비교하여
A값보다 B값이 1 클 때 B를 반환
같을 때 D 반환
그렇지 않으면 A 반환


function solution(aNum, bNum) {
  let answer = [];
  let rival = bNum.map((e) => (e === 1 ? e + 3 : e));

  aNum.forEach((e, i) => {
    if (e + 1 === rival[i]) {
      answer.push("B");
    } else if (e === rival[i]) {
      answer.push("D");
    } else {
      answer.push("A");
    }
  });

  return answer;
}

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

격자판 최대합

map함수와 reduce함수를 이용하여 행과 열의 합을구하고
reduce함수로 대각선의 값을 구한 뒤
최대값 반환

let nums = [
  [10, 13, 10, 12, 15],
  [12, 39, 30, 23, 11],
  [11, 25, 50, 53, 15],
  [19, 27, 29, 37, 27],
  [19, 13, 30, 13, 19],
];

function solution(nums) {
  const row = nums.map((e) => e.reduce((acc, current) => acc + current));
  const column = nums.map((e, i) =>
    nums.reduce((acc, current) => acc + current[i], 0)
  );
  const s = nums.reduce((acc, current, i) => acc + current[i], 0);
  const sr = nums.reverse().reduce((acc, current, i) => acc + current[i], 0);

  return Math.max(...row, ...column, s, sr);
}

console.log(solution(nums));

문자열 압축

객체를 이용하여 중복되는 문자의 갯수를 카운트한 후
정답배열에 1을 제외하고 모든 문자와 숫자 추가 후 join

let str = "KKHSSSSSSSE";

function solution(str) {
  let answer = [];
  let obj = {};
  str.split("").forEach((e) => (obj[e] ? (obj[e] += 1) : (obj[e] = 1)));

  for (let i in obj) {
    answer.push(i);
    if (obj[i] !== 1) {
      answer.push(`${obj[i]}`);
    }
  }
  return answer.join("");
}

console.log(solution(str));

멘토링

리그형식으로 학생들을 모두 짝지은 후
시험의 횟수와 짝지은 값들의 중복 값이 같으면 정답 카운트를 올린다

let nums = [
  [3, 4, 1, 2],
  [4, 3, 2, 1],
  [3, 1, 4, 2],
];

function solution(nums) {
  let pair = nums.map((nl) => {
    let arr = [];
    let index = 0;
    while (index < nl.length - 1) {
      for (let j = index + 1; j < nl.length; j++) {
        arr.push(`${nl[index]}${nl[j]}`);
      }
      index++;
    }
    return arr;
  });

  let mentoList = pair.flat().reduce((acc, current) => {
    acc[current] = (acc[current] || 0) + 1;
    return acc;
  }, {});

  return Object.values(mentoList).filter((e) => nums.length === e).length;
}

console.log(solution(nums));

캐시문제

캐시배열에 캐시 길이만큼의 0을 채움
추가되는 메모리값들을 forEach함수로 돌며
캐시배열에 메모리값이 없으면 캐시에서 pop하고 메모리값을 추가
메모리값이 있으면 해당 메모리값을 지운뒤, unshift로 앞에 추가

let nums = [1, 2, 3, 2, 6, 2, 3, 5, 7];
let n = 5;

function solution(nums, n) {
  let cache = new Array(n).fill(0);

  nums.forEach((e) =>
    !cache.includes(e)
      ? (cache.pop(), cache.unshift(e))
      : (cache.splice(cache.indexOf(e), 1), cache.unshift(e))
  );
  return cache;
}

console.log(solution(nums, n));
profile
개발자 지망생

0개의 댓글