코로 넘어져도 헤딩만 하면 그만

[알고리즘]3 거듭제곱, 4_firstCharacter, 5 firstReverse 본문

CODE STATES 44/데일리 코딩(알고리즘)

[알고리즘]3 거듭제곱, 4_firstCharacter, 5 firstReverse

꼬드리 2023. 3. 16. 10:35

3. 거듭제곱 여부 확인하기

문제: 수를 입력받아 2의 거듭제곱인지 여부를 리턴해야 합니다.

  • boolean 타입을 리턴해야 합니다.
  • 반복문(while)문을 사용해야 합니다.
  • 2의 0승은 1입니다.
  • Number.isInteger, Math.log2, Math.log 사용은 금지됩니다.
function powerOfTwo(num) {
  if (num === 1) {
    return true;
  }
  //1은 2의 0승이니까...

  if (num % 2) {
    return false;
  } //짝수이면 이 조건문을 실행하지 말되 홀수면 false를 리턴.

  let powered = 2;
  while (powered < num) {
    powered = powered * 2;
  } //초기값 2로 두고 2를 계속 곱하다가 같아지면 true를 리턴하라.
  return powered === num;
}

num%2가 바로 이해가 가지 않았다.

처음엔 짝수일 때 false를 출력하라는 말인 줄 알았는데, 2로 나눠서 0이 되면 이 조건 자체가 실행되지 않는다는 걸 나중에 깨달았다. 짝수이면 실행하지 말고, 홀수일 때만 false를 리턴하라는 뜻이다. 이렇게 조건을 걸어줄 수도 있구나...

 

 

 


 

 

4. 문자열의 첫번째 단어로 이루어진 문자 만들기

문자열을 입력받아 문자열을 구성하는 각 단어의 첫 글자로 이루어진 문자열을 리턴해야 합니다.

조건:

  • 단어는 공백 한 칸으로 구분합니다.
  • 연속된 공백은 없다고 가정합니다.
  • 빈 문자열을 입력받은 경우, 빈 문자열을 리턴해야 합니다.
function firstCharacter(str) {
  // 단어는 공백 한 칸으로 구분합니다.
  // 빈 문자열을 입력받은 경우, 빈 문자열을 리턴해야 합니다.
  // 연속된 공백 없음, string 리턴
  // split으로 공백 기준 잘라 배열로 만들어준다.
  // 배열의 첫글자만 따서 문자열에 넣어주기
  if (str.length === 0) {
    return '';
  }
  let arr = str.split(' ');
  console.log(arr);
  let resultStr = '';
  for (i = 0; i < arr.length; i++) {
    resultStr = resultStr + arr[i][0];
  }
  return resultStr;
}

그리 어렵지는 않은 문제였다. split으로 공백이나 , 기준으로도 배열로 잘라낼 수 있다는 걸 이전에 코플릿에서 습득한 상태였기 때문에...

str.split을 하여 빈칸 기준으로 자른 단어들을 배열 하나에 담아준다. 이후 배열 내부의 단어들을 for문으로 순회하며 하나씩 맨 첫글자만 따서 새로운 단어를 만들어주면 된다. 깔끔한 문제.  

 

 

5. firstReverse

문자열을 입력받아 순서가 뒤집힌 문자열을 리턴해야 합니다.

function firstReverse(str) {
// 문자열로 들어온 str을 
//순서를 하나하나 뒤집어서 리턴한다?
//문자열을 배열화시킨다 
//이제 이 결과를 .split로 나눠본다
 let result = str.split('').reverse().join(''); 
 return String(result);
}

split이 문자열을 배열화 시킨다는 사실을 잊고 잠깐 헤맸다. 또 reverse()와 join('')은 처음 써봐서 당혹했다. 당연히 그런 게 있을 것 같긴 했는데...

배열이기 때문에 마지막에 String로 문자열까지 바꿔줘야 한다는 사실을 잊지 말자.

//result[i]가 result[result.length-1 - i]여야하는 거 아님?
//  for(i=0; i<result.length; i++){
//    result[i]= result[result.length-1 - i]
//  }

사실 처음 작성했던 코드에는 위와 같은 부분이 있었다. for문으로 배열의 index를 바꿔주는 방법이 있을 것도 같은데...

하긴 배열의 순서 뒤집기는 reverse()가 훨씬 간편한 것 같다. 

 

const reverse = [];
for(let i=arr.length-1; i >= 0; i--) {
  reverse.push(arr[i]);
}

for 문으로 배열 쉽게 뒤집는 법에 대해 더 찾아본 결과. 

Comments