TIL. 알고리즘 문제풀이

seul_velog·2022년 8월 9일
0

TIL_algorithm

목록 보기
7/26

1. 공통된 시작 단어

문제 설명

왕비를 피해 일곱 난쟁이들과 함께 평화롭게 생활하고 있던 백설공주에게 위기가 찾아왔다. 일과를 마치고 돌아온 난쟁이가 일곱 명이 아닌 아홉 명이었던 것이다. 아홉 명의 난쟁이는 모두 자신이 "백설 공주와 일곱 난쟁이"의 주인공이라고 주장했다. 뛰어난 수학적 직관력을 가지고 있던 백설공주는, 다행스럽게도 일곱 난쟁이의 키의 합이 100이 됨을 기억해 냈다. 아홉 난쟁이의 키가 주어졌을 때, 백설공주를 도와 일곱 난쟁이를 찾는 프로그램을 작성하시오.

입력설명
아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다.

출력설명
입력된 순서대로 일곱 난쟁이의 키를 출력한다.

▣ 입출력 예

inputoutput
20 7 23 19 10 15 25 8 1320 7 23 19 10 8 13

풀이

✍️ solution

const findDwarfs = (people) => {
  let findDwarfsCopy = people; // 얕은 복사는 똑같은 객체를 참조하므로 
  let total = people.reduce((a, b) => a + b, 0);

  for (let i = 0; i < people.length; i++) {
    for (let j = 1; j < people.length; j++) {
      if (total - (people[i] + people[j]) === 100) {
        findDwarfsCopy.splice(j, 1);
        findDwarfsCopy.splice(i, 1);
        return people;
      }
    }
  }
};
  • reduce 로 배열의 총합을 구한다.
  • 얕은 복사는 똑같은 객체를 참조하므로 위와 같이 작성할 수 있다.
  • 배열의 총합 total에서 나머지 배열의 합의 차가 100인 배열의 인덱스를 찾는다.
  • splice를 통해 각각 배열의 인덱스를 제거한다. 이때 i를 먼저 제거하면 배열의 개수가 달라지므로 j를 먼저 제거한다.






2. A를 #으로

문제 설명

대문자로 이루어진 영어단어가 입력되면 단어에 포함된 ‘A'를 모두 ’#‘으로 바꾸어 출력하는 프로그램을 작성하시오.

입력설명
첫 번째 줄에 문자열이 입력된다.

출력설명
첫 번째 줄에 바뀐 단어를 출력한다.

▣ 입출력 예

inputoutput
BANANAB#N#N#

풀이

const changeChar = (str) => {
  changedStr = str.replace(/A/g, '#');
  return changedStr;
};

const char = 'BANANA';
const result = changeChar(char);

console.log(result); // B#N#N#
  • string은 값이 복사가 된다. 배열객체 처럼 주소 복사가 아니다.

📌 replace()로 문자열 치환

// ex) 
let str = 'Hello world, Java';

str = str.replace('Java', 'JavaScript');
console.log(str); // Hello world, JavaScript
  • replace('A','B') 는 문자열에 있는 A를 B로 바꾼 문자열을 리턴한다.
  • ❗️ 바꾸려는 문자열이 여러개 있어도, 가장 먼저 찾은 문자열 1개만 변환한다는 점 주의!
  • 따라서 정규식을 이용, 모든 문자열을 치환하는 방법으로 해결했다. 😀
  • 참고한 글

✍️ solution
for of 를 사용해서 풀어보기 🧐

const solution = (s) => {
  let answer = '';
  for (let x of s) {
    if (x === 'A') answer += '#';
    else answer += x;
  }
  return answer;
};

let str = 'BANANA';
console.log(solution(str)); // B#N#N#






3. 문자 찾기

문제 설명

한 개의 문자열을 입력받고, 특정 문자를 입력받아 해당 특정문자가 입력받은 문자열에 몇 개 존재하는지 알아내는 프로그램을 작성하세요. 문자열의 길이는 100을 넘지 않습니다.

입력설명
첫 줄에 문자열이 주어지고, 두 번째 줄에 문자가 주어진다.

출력설명
첫 줄에 해당 문자의 개수를 출력한다.

▣ 입출력 예

inputoutput
COMPUTERPROGRAMMING, R3

풀이

const findChar = (str, char) => {
  let count = 0;
  for (x of str) {
    if (x === char) {
      count++;
    }
  }
  return count;
};
const str = 'COMPUTERPROGRAMMING';
const char = 'R';
console.log(findChar(str, char)); // 3
  • for...of 를 사용해서 받아온 문자열에서 해당하는 알파벳을 찾아준다.

✍️ solution
split() 를 사용해서 풀어보기 🧐

const solution = (s, t) => {
  let answer = s.split(t).length;
  return answer - 1;
};

const str = 'COMPUTERPROGRAMMING';
console.log(solution(str, 'R')); // 3
  • 받아온 문자열에서 t 를 구분자로 하여 배열형태로 나눠주는 특징을 사용한다.
  • 이때 구분자 t 가 맨 뒤에 위치하더라도 마지막 배열은 [""] 와 같은 빈 문자열배열이 들어오므로 결과값은 동일하다! 😀

✍️ 비슷한 문제

4. 머쓱이 보다 키 큰 사람

문제 설명

머쓱이는 학교에서 키 순으로 줄을 설 때 몇 번째로 서야 하는지 궁금해졌습니다. 머쓱이네 반 친구들의 키가 담긴 정수 배열 array와 머쓱이의 키 height가 매개변수로 주어질 때, 머쓱이보다 키 큰 사람 수를 return 하도록 solution 함수를 완성해보세요.


▣ 입출력 예

inputoutput
[149, 180, 192, 170], 1673
[180, 120, 140], 1900

풀이

const answer = (arr, height) => {
  let count = 0;
  for (x of arr) {
    if (x > height) count++;
  }
  return count;
};

const arr = [149, 180, 192, 170];
const height = 167;
console.log(answer(arr, height)); // 3

const arr2 = [180, 120, 140];
const height2 = 190;
console.log(answer(arr2, height2)); // 0
profile
기억보단 기록을 ✨

0개의 댓글