Javascript 알고리즘 기본문제풀이 9번~17번

Hyodduru ·2022년 1월 29일
0

Algorithm

목록 보기
2/25
post-thumbnail

기본문제풀이

9. A를 #로

문자 'A'를 '#'로 바꾸어서 다시 return 한다.

  function solution(str) {
    //나의 풀이
   let answer = str.replaceAll("A", "#");
   //선생님 풀이
  let answer ='';
   for(let x of str){
    if(x === 'A')answer +='#';
    else answer +=x;
  }

   //또다른 풀이
  let answer = str;
  answer = answer.replace(/A/g, '#');
    return answer;
  }
  console.log(solution("BANANA"));

참고로 str을 answer 에 할당해서 str 값을 수정한다해도 자동적으로 answer 값이 바뀌지는 않음. answer에서 직접 바꾸어주어야함. 문자열에서는 배열이나 객체와 같은 얕은 복사가 되지 않는다.

10. 문자 찾기

문장과 문자를 인자로 받는 함수에서 해당 문자의 갯수를 return한다.

  function solution(s, t) {
    let answer = 0;

    // 나의 풀이
    Array.from(s).forEach((letter) => {
      if (letter === t) {
        answer++;
      }
    });
    // 선생님 풀이
    for(let x of s){
      if(x===t)answer++;
    }

  // 또다른 풀이 - 이풀이 좋은듯
  let answer = s.split(t).length -1 ;

    return answer;
  }

  console.log(solution("COMPUTERPROGRAMMING", "R"));
  

split method는 지정한 구분자를 이용하여 여러 개의 문자열로 나눈다.

11. 대문자 찾기

  function solution(s) {
    let answer = 0;
    for (let x of s) {
      let num = x.charCodeAt(); 
      // 각 문자의 아스키넘버  대문자 : 65 ~ 90 알아둘 것!  소문자 : 97 ~ 122;
      if (num >= 65 && num <= 90) answer++;

      //  if(x===x.toUpperCase())answer++;

    }
    return answer;
  }

⭐️ 아스키코드란?

컴퓨터는 0과 1 숫자 밖에 모르기 때문에 문자도 숫자로 기억한다.

이때, 어떤 숫자와 어떤 문자를 대응시키는가에 따라 여러 가지 인코딩 방식이 있는데 통상 아스키 코드 방식을 많이 사용한다.

아스키 코드(ASCII Table)는 0번부터 127번까지만 사용한다.

⭐️ 참고로 알아두기 <string.charCodeAt()>
아스키 코드 대문자 : 65 ~ 90 반환
아스키 코드 소문자 : 97 ~ 112 반환
-> 대문자와 소문자 값 차이는 32이다.

12. 대문자로 통일

문자열을 받아 소문자인 문자들을 대문자로 전환하여 리턴한다.

  function solution(s) {
    // 나의 풀이
    // let answer;
    // answer = Array.from(s)
    //   .map((letter) => letter.toUpperCase())
    //   .join("");

    // 선생님 풀이
    let answer = "";
    for (let x of s) {
      let num = x.charCodeAt();
      // 아스키코드를 활용한 방법
      if (num >= 97 && num <= 122) answer += String.fromCharCode(num - 32);
      else answer += x;
      // toLowerCase()를 활용한 방법 
      // if (x === x.toLowerCase()) answer += x.toUpperCase();
      // else answer += x;
    }

     // 더 간단한 풀이
     let answer = s.toUpperCase();
     return answer;
  }
  console.log(solution("ItisTimeToStudy"));
  
  

13. 대소문자 변화

  function solution(s) {
    // 나의 풀이
    let answer = "";
    for (let x of s) {
      // if (x === x.toLowerCase()) answer += x.toUpperCase();
      // else answer += x.toLowerCase();

    // 아스키코드 활용 방식
      let num = x.charCodeAt();
      if (num >= 97 && num <= 122) answer += String.fromCharCode(num - 32);
      else answer += String.fromCharCode(num + 32);
    }

    return answer;
  }

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

String.fromCharCode() : 아스키코드를 인자로 받아 문자열로 반환한다.

14. 가장 긴 문자열

문자열의 배열을 인자로 받아 가장 긴 문자열을 리턴하는 함수

  function solution(n, arr) {
  // 나의 풀이
  let answer = "";
  let max = 0;

  for (let x of arr) {
    if (x.length > max) {
      max = x.length;
      answer = x;
    }
  }

    // 선생님 풀이
    let answer,
      max = Number.MIN_SAFE_INTEGER;
    for (let x of s) {
      if (x.length > max) {
        max = x.length;
        answer = x;
      }
    }

    return answer;
  }
  console.log(
    solution(5, ["teacher", "time", "student", "beautiful", "good"])
  );

15. 가운데 문자 출력

문자열의 중앙 문자를 리턴한다. 짝수일 경우 가운데 두 문자를 리턴한다.

 function solution(s) {
      // 나의 풀이
      // let answer;
      // let index = Math.floor(s.length / 2);
      // answer = s.length % 2 === 0 ? s[index - 1] + s[index] : s[index];

      // 선생님 풀이
      let answer;
      let mid = Math.floor(s.length / 2);

      if (s.length % 2 === 1) answer = s.substring(mid, mid + 1);
          else answer = s.substring(mid - 1, mid + 1);

       return answer;
       }           
       console.log(solution("study"));
       console.log(solution("good"));
       

⭐️ 새로 배운 것 : string.substring(indexStart, indexEnd)
-> string객체의 시작 인덱스부터 종료 인덱스 전까지 문자열의 부분 문자열을 반환한다.
-> indexEnd : 옵션, 반환문자열 마지막 인덱스 (포함하지 않음)

⭐️ str.substr(indexStart, length)
-> length : 총 몇개의 문자를 뽑아낼 것인지 지정한다.
ex) s.sub(mid,1)

16. 중복문자 제거 indexOf

문자열을 인자로 받아 중복된 단어들을 없앤 새로운 문자열을 return한다.

  function solution(s) {
    // 나의 풀이
    // let answer = "";
    // for (let x of s) {
    //   if (!answer.includes(x)) answer += x;
    // }
    
    //나의 풀이 2 
    let answer = Array.from(new Set(str)).join("");

	//나의 풀이 3 
	//let answer = '';
    // for (let x of str) {
    //   if (answer.indexOf(x) === -1) answer += x;
    // }
    
    // 선생님 풀이
    let answer = "";
    for (let i = 0; i < s.length; i++) {
      if (s.indexOf(s[i]) === i) answer += s[i];
    }
    return answer;}

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

⭐️ 참고) indexOf('x',1 ) 두번째 인자의 의미
-> 해당 지수부터 찾아낸다. 즉 0번은 건너뛰고 지수 1번부터 x 에 해당하는 item을 찾아낸다는 의미이다.

17. 중복단어 제거

문자열들의 배열을 인자로 받아 중복된 값을 제거한 새로운 배열을 return한다. (filter와 indexOf의 활용)

  function solution(arr) {
    // 나의 풀이
    // let answer = [];
    // arr.forEach((str) => {
    //   if (!answer.includes(str)) answer.push(str);
    // });

    // indexOf 이용해보기
    // let answer = [];
    // for (let i = 0; i < arr.length; i++) {
    //    if (i === arr.indexOf(arr[i])) answer.push(arr[i]);
    // }

    // filter 이용해보기
    let answer = arr.filter((str, i) => arr.indexOf(str) === i);

    return answer;
  }

  console.log(solution(["good", "time", "good", "time", "student"]));
profile
꾸준히 성장하기🦋 https://hyodduru.tistory.com/ 로 블로그 옮겼습니다

0개의 댓글