TIL. 알고리즘 문제풀이

seul_velog·2022년 4월 24일
0

TIL_algorithm

목록 보기
5/26

1. 10부제

문제 설명

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

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

▣ 입력설명

첫 줄에는 날짜의 일의 자리 숫자가 주어지고, 두 번째 줄에는 7대의 자동차 번호의 끝 두 자 리 숫자가 주어진다.

▣ 출력설명

주어진 날짜와 자동차의 일의 자리 숫자를 보고 10부제를 위반하는 차량의 대수를 출력한다.

▣ 입출력 예

inputoutput
3, [25, 23, 11, 47, 53, 17, 33]3
0, [12, 20, 54, 30, 87, 91, 30]3

풀이

 const numberOfCar = (day, nums) => {
  let answer = 0;
  for (let i = 0; i < nums.length; i++) {
    const lastNum = String(nums[i])[1];
    if (lastNum === String(day)) {
      answer++;
    }
  }
  return answer;
};

const day = 3;
const nums = [25, 23, 11, 47, 53, 17, 33];
console.log(numberOfCar(day, nums));

✍️

  • 파라미터로 받아온 nums 는 숫자이므로 전역객체 String 을 사용해서 문자열로 바꾼다음 자동차 번호의 끝자리를 찾는다.
  • 마찬가지로 받아온dayString 으로 바꿔서 비교한다. String을 쓰지 않고도 해결할 수 있는 더 간단한 방법이 있을 것 같다. 🤔

solution

 function solution(day, nums) {
        let answer = 0;
        for (let x of nums) {
          if (x % 10 === day) answer++;
        }
        return answer;
      }
      console.log(solution(day, nums));

✍️ % 나머지 연산자를 사용해서 간단하게 풀 수 있다. 😀






2. 숫자 뒤집기

문제 설명

reverse 함수에 정수인 숫자를 인자로 받는다. 그 숫자를 뒤집어서 return하기.

x: 숫자 return: 뒤집어진 숫자를 반환한다.

▣ 입출력 예

inputoutput
12344321
-1234-4321
1230321

풀이

✍️ 첫 번째 풀이

const reverse = x => {
  let numString = x + '';
  let numReverse = numString.split('').reverse();
  if(x<0){
    let minus = numReverse.splice(numReverse.length-1 , 1);
    let combine = minus.concat(numReverse);
    let result = combine.join('');
    return Number(result)
  }
  else{
    let result = numReverse.join('');
    return Number(result)
  }

✍️ split , reverse , splice , concat , join 다양한 메서드를 활용해서 풀어보았다.


✍️ 두 번째 풀이

const reverse = x => {
let numString = x + ''; // 1)
let numReverse = numString.split('').reverse(); // 2)
  if(numReverse[numReverse.length-1] === '-') {
    numReverse.pop() // 3) 
    numReverse.unshift('-') // 4) 
  }
  return Number(numReverse.join('')); // 5)
}

✍️ popunshift 를 통해서 풀어 보았다

  • 1) '1234'
  • 2) ['4','3','2','1']
  • 3) -만 없어진 상태이다.
  • 4) 맨 앞 요소에 - 추가한다.
  • 5) join을 통해서 문자열 변경 → number을 통해서 상수로 변경한다.






3. 뒤집어진 모양 판단하기

문제 설명

숫자인 num을 인자로 넘겨주면, 뒤집은 모양이 num과 똑같은지 여부를 반환한다.
num: 숫자 return: true or false (뒤집은 모양이 num와 똑같은지 여부)
예를 들어, num = 123 return false => 뒤집은 모양이 321 이기 때문이다.

▣ 입출력 예

inputoutput
1221true
-121false
10false

num = 1221 return true (=> 뒤집은 모양이 1221 이기 때문)
num = -121 return false (=> 뒤집은 모양이 121- 이기 때문)
num = 10 return false (=> 뒤집은 모양이 01 이기 때문)


풀이

const sameReverse = num => {
  let numToString = num + '';
  let reverseNum = numToString.split('').reverse();
  if(num<0) {
    let reverseResult = reverseNum.join('');
    return numToString === reverseResult;
  }
  else {
    let reverseResult = Number(reverseNum.join(''));
    return num === reverseResult;
  }
}

✍️ 2번 문제와 비슷한 유형이다. 😀

  • 마찬가지로 split , reverse , Number , join 를 이용해서 풀어보았다.
  • if 조건문을 활용하여 음수를 받을 때와 양수를 받을 때를 다르게 하여 비교, 출력한다.




자바스크립트 알고리즘 문제풀이
leetcode

profile
기억보단 기록을 ✨

0개의 댓글