[알고리즘] 기본문제 풀이

먼지·2022년 4월 24일
1
post-thumbnail

6. 홀수

7개의 자연수가 주어질 때, 이들 중 홀수인 자연수들을 모두 골라 그 합을 구하고, 고른 홀수들
중 최소값을 찾는 프로그램을 작성하세요

function solution(arr) { 
  const oddNums = arr.filter(n => n % 2 === 1);
  const sum = oddNums.reduce((prev, cur) => prev + cur);
  const min = oddNums.reduce((prev, cur) => prev > cur ? cur : prev)
  return [sum, min];
}

배움

==, === 통일하기.
최솟값 초기화 방법. 큰 값으로 해놓으면 첫 번째 최솟값이 무조건 참이라서 들어감

const min = Number.MAX_SAFE_INTEGER;

합과 최솟값을 구하는 부분에서 reduce가 떠올랐는데 많이 써보지 않아서 검색해서 풀었다.
reduce 말고 다른 유용한 JS API가 있는지 찾아봐야겠다.

7. 10부제

서울시는 6월 1일부터 교통 혼잡을 막기 위해서 자동차 10부제를 시행한다. 자동차 10부제는
자동차 번호의 일의 자리 숫자와 날짜의 일의 자리 숫자가 일치하면 해당 자동차의 운행을 금
지하는 것이다. 예를 들어, 자동차 번호의 일의 자리 숫자가 7이면 7일, 17일, 27일에 운행하
지 못한다. 또한, 자동차 번호의 일의 자리 숫자가 0이면 10일, 20일, 30일에 운행하지 못한
다.

여러분들은 일일 경찰관이 되어 10부제를 위반하는 자동차의 대수를 세는 봉사활동을 하려고
한다. 날짜의 일의 자리 숫자가 주어지고 7대의 자동차 번호의 끝 두 자리 수가 주어졌을 때
위반하는 자동차의 대수를 출력하는 프로그램을 작성하세요.

function solution1(day, cars) {
  const carStrArr = cars.map(car => String(car)[1]);
  return carStrArr.filter(carStr => String(day) === carStr).length 
}

function solution2(day, cars) {
  return cars.filter(num => num % 10 === day).length;
}

문자열 인덱싱에 익숙해서 1의 자리를 나눠서 추출할 생각을 못 했음..!

8. 일곱난쟁이

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

function solution(arr) {
}

2중 for문이 아직 익숙하지 않아서 좀 어려웠음.. 다시 풀어봐야지ㅜㅜ

9. A를 #으로

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

function solution1(str) {
  let result = '';
  for(let i = 0; i < str.length; i++) {
    if(str[i] === 'A') result += '#'
    else result += str[i]
  }
  return result;
}

function solution2(str) {
 let result = '';
 for(let x of str) {
   if(x === 'A') result += '#'
   else result += x
 }
 return result;
}

function solution3(str) {
  return str.replace(/A/g, '#')
}

10. 문자 찾기

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

function solution(str, t) {
  let count = 0;
  for(let x of str) {
    if (x=== t) count+=1;
  }
  return count;
}

function solution2 (s, t) {
  // return s.split(t).length; // COMPUTERPROGRAMMINGR => ['COMPUTE', 'P', 'OG', 'AMMING', '']
  return s.split(t).length - 1;
}

11. 대문자 찾기

한 개의 문자열을 입력받아 해당 문자열에 알파벳 대문자가 몇 개 있는지 알아내는 프로그램
을 작성하세요.

function solution(s) {
  let count = 0;
  for (let x of s) {
    if (x === x.toUpperCase()) count++;
  }
  return count;
}

12. 대문자로 통일

대문자와 소문자가 같이 존재하는 문자열을 입력받아 대문자로 모두 통일하여 문자열을 출력
하는 프로그램을 작성하세요.

function solution(s) {
  return s.toUpperCase();
}

console.log(solution('ItisTimeToStudy')); // ITISTIMETOSTUDY

13. 대소문자변환

대문자와 소문자가 같이 존재하는 문자열을 입력받아 대문자는 소문자로 소문자는 대문자로
변환하여 출력하는 프로그램을 작성하세요.

function solution(s) {
  let answer= '';
  for(let x of s) {
    if (x === x.toUpperCase()) answer += x.toLowerCase()
    else answer += x.toUpperCase()
  }
  return answer;
}

console.log(solution('StuDY')); // sTUdy

14. 가장 긴 문자열

N개의 문자열이 입력되면 그 중 가장 긴 문자열을 출력하는 프로그램을 작성하세요.

function solution(stringArr) {
  // let max = Number.MIN_SAFE_INTEGER;
  let longStr = stringArr[0];
  for(let x of stringArr) {
    if(x.length > longStr.length) longStr = x;
  }
  return longStr;
}
			
console.log(solution(['oh', 'teacher', 'time', 'student', 'beautiful', 'good'])); // 'beautiful'

강사님은 min, max를 구하는 문제에서 변수를 초기화할 때 Number.MIN_SAFE_INTEGER MAX_SAFE_INTEGER 를 이용하는데 까먹기도 하고 다른 사람들도 이렇게 푸는지 궁금하당

15. 가운데 문자 출력(substring, substr)

function solution(s) {
  let mid = Math.floor(s.length / 2)
  if (s.length % 2 === 0) {
    // s.substr(mid - 1, 2)
    return s.substring(mid - 1, mid + 1)
  } else {
    // s.substr(mid, 1)
    return s.substring(mid, mid + 1)
  }
}

console.log(solution('study')); // t
console.log(solution('good')); // oo

16. 중복문자제거(indexOf)

소문자로 된 한개의 문자열이 입력되면 중복된 문자를 제거하고 출력하는 프로그램을 작성하
세요.
제거된 문자열의 각 문자는 원래 문자열의 순서를 유지합니다.

function solution(str) {
  // ksekkset -> kset
  let answer = '';
  for(let i = 0; i < str.length; i++) {
    if(str.indexOf(str[i]) === i) answer += str[i]
  }
  return answer;
}

console.log(solution('ksekkset')); // kset

17. 중복단어제거

N개의 문자열이 입력되면 중복된 문자열은 제거하고 출력하는 프로그램을 작성하세요.
출력하는 문자열은 원래의 입력순서를 유지합니다.

function solution(strArr) {
  return strArr.filter((str, i) => strArr.indexOf(str) === i)
}

console.log(solution(['good','time','good','time','student'])); 
// ['good', 'time', 'student']
profile
꾸준히 자유롭게 즐겁게

0개의 댓글