[알고리즘] 약수의 개수와 덧셈, 대소문자 변환, 가장 긴 문자열

Perfume·2022년 4월 27일
0

Algorithm

목록 보기
5/11
post-thumbnail

💡 약수의 개수와 덧셈

두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.

각 수의 약수들을 담은 배열을 만들고, 그 배열의 길이가 홀수인지 짝수인지 구분해서 계산하는 방식으로 접근했다. 그래서 일단 이중for문을 만들어 약수가 담긴 numOfFac이라는 배열을 만들었다.

function solution(left, right) {
        let answer = 0;
        for (let i = left; i <= right; i++) {
          let numOfFac = [];
          for (let j = 1; j <= i; j++) {
            if (i % j === 0) 
              numOfFac.push(j);
          }
        }

여기까지 작성한 다음 console.log(numOfFac)을 확인해보면 다음과 같다. (left로 13, right가 17이라는 값을 넣었다.)

[ 1, 13 ]

[ 1, 2, 7, 14 ]

[ 1, 3, 5, 15 ]

[ 1, 2, 4, 8, 16 ]

[ 1, 17 ]

바라던 대로 각 수의 약수들이 배열로 반환되었다. 이제 이 배열의 길이를 재서 홀수면 -, 짝수면 +를 해주면 된다. 내가 작성한 최종 코드는 다음과 같다.

function solution(left, right) {
        let answer = 0;
        for (let i = left; i <= right; i++) {
            let numOfFac = [];
          for (let j = 1; j <= i; j++) {
            if (i % j === 0) 
              numOfFac.push(j);
            
          }
            
          if (numOfFac.length % 2 === 0) {
            answer += i;
          } else {
            answer -= i;
          }
        }

        return answer;
      }

💡 대소문자 변환

지난 번에 "대문자 변환" 문제에서 썼던 toUpperCase()를 똑같이 사용했지만, 대소문자를 판별하는 과정만 추가했다. 그래서 비교적 간단하게 해결할 수 있었다.

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

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

💡 가장 긴 문자열

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

내가 처음 생각했던 방식은 string의 length를 재서 긴 길이를 가진 string을 answer로 return 하는 거였다. 다음이 내가 처음에 작성했던 코드다.

      function solution(s) {
        let answer = "";
        for (let i = 0; i <= s.length; i++) {
          for (let j = 1; j <= s.length; i++) {
            if (s[i].length >= s[j].length) {
              answer = s[i];
            } else answer = s[j];
          }
        }
        return answer;
      }
      let str = ["teacher", "time", "student", "beautiful", "good"];
      console.log(solution(str));

하지만..

Uncaught TypeError: Cannot read properties of undefined (reading 'length')

역시 어림없었다.

그래서 max라는 최대값을 뜻하는 변수를 만들고, 이중for문 대신 그냥 for-of문을 사용했다. MIN_SAFE_INTEGER를 통해 초기값으로 가장 작은 정수를 설정해두고, 각 요소를 돌며 긴 length를 가진 값을 answer로 할당하는 방식의 풀이다.

function solution(s) {
  let answer,
    max = Number.MIN_SAFE_INTEGER;
  for (let x of s) {
    if (x.length > max) {
      max = x.length;
      answer = x;
    }
  }
  return answer;
}
profile
공부하는 즐거움

0개의 댓글