본문 바로가기

Learn/Javascript

반복문 어려웠던 문제 피드백

makeDigits2

문제

수(num)를 입력받아 1부터 num까지의 정수로 구성된 문자열을 리턴해야 합니다.

 

입출력 예시

let output = makeDigits2(5);
console.log(output); // --> "1-2-3-4-5"

output = makeDigits2(7);
console.log(output); // --> "1-2-3-4-5-6-7"

---

function makeDigits2(num) {
//수(num)를 입력받아 1부터 num까지의 정수로 구성된 문자열을 리턴해야 합니다.
//숫자(number string) 사이를 '-'로 구분합니다. ('1-2-3-4-5')
let result = '1'                  //string 타입을 리턴 이때 1부터 시작
let i = 2                         // while문 시작
while (i<=num){                   
  result = result + `-${i}`;
i++;
}
return result
}

// for문과 while문 차이 숙지
// 백틱``사용

getMaxNumberFromString

문제

숫자 문자열을 입력받아 문자열을 구성하는 각 숫자 중 가장 큰 수를 나타내는 숫자를 리턴해야 합니다.

주의 사항

  • 반복문(for)문을 사용해야 합니다.
  • str.split 사용은 금지됩니다.
  • 빈 문자열을 입력받은 경우, 0을 리턴해야 합니다.

입출력 예시

let output = getMaxNumberFromString('53862');
console.log(output); // --> '8'

output = getMaxNumberFromString('4321');
console.log(output); // --> '4'

---

function getMaxNumberFromString(str) {
  //숫자 문자열을 입력받아 문자열을 구성하는 각 숫자 중 가장 큰 수를 나타내는 숫자를 리턴해야 합니다.
  //string 타입을 리턴해야 합니다.
  //str.split 사용은 금지됩니다.
  //빈 문자열을 입력받은 경우, 0을 리턴해야 합니다.
  let str = '0';
  for (let i=0; i<str.lenght; i++){
    if
  }
  
}
// ***************************** 
// 해석본듣고 수정하기

// 페어랑 문제 해결
function getMaxNumberFromString(str) {
  //숫자 문자열을 입력받아 문자열을 구성하는 각 숫자 중 가장 큰 수를 나타내는 숫자를 리턴해야 합니다.
  //string 타입을 리턴해야 합니다.
  //str.split 사용은 금지됩니다.
  //빈 문자열을 입력받은 경우, 0을 리턴해야 합니다.
  let result= '0';
  for (let i=0; i<str.length; i++){
    if (str[i] > result) {     // 문자열을 구성하는 각 숫자 중 가장 큰 수를 나타내는 숫자를 리턴해야 합니다.  
   result = str[i];
  }  
  }
  return result;
}

선생님 해석 본

function getMaxNumberFromString(str) {
  // 문자열을 입력 받는다 '53862'
  // 출력 '8'
  // 문제가 있다. 문자열끼리 비교가 가능????? 안된다.
  // 숫자끼리 비교해야 하는데, 어떻게 비교하죠?
  
  // Tip!
  // 컴퓨터에게 가장 긴 거, 가장 큰 거 판단하게 하는 방법
  // 기준을 하나 만들어 놓고,
  // 그 기준과 비교해서 더 크면(또는 길면) 기준 교체

  // 기준은 0
  let max = 0;

  for(let i = 0; i < str.length; i++) {
    // str[0]가 max보다 크면, max는 지금부터 str[0]
    if (Number(str[i]) > max) {
      max = Number(str[i]);               // Number () 를 붙여야 숫자값으로 반환
    }
  }
  // 8
  return String(max);                      // 문제에서 문자열로 리턴해야 했기 때문에
}                                          // String() 사용
// 여러분이 나중에 코드를 짜실때
// 이런 암묵적 형변환을 생각하지 않고 짜는게 더 좋은 코드
// 장점보단 단점이 훠어어어어어얼씬
// 오류가 나야 되는데 안나요.

replaceAll

문제

문자열과 두 개의 문자(from, to)를 입력받아, 문자열에 등장하는 특정 문자(from)가 다른 문자(to)로 바뀐 문자열을 리턴해야 합니다.

입출력 예시

let output = replaceAll('loop', 'o', 'e');
console.log(output); // --> 'leep'

----

function replaceAll(str, from, to) {
  // 문자열과 두 개의 문자(from, to)를 입력받아, 문자열에 등장하는 특정 문자(from)가 다른 문자(to)로 바뀐 문자열을 리턴해야 합니다.
  // string 타입을 리턴해야 합니다.
  let result = ''
  for (i=0; i<str.length; i++) {
    if (str[i] === from) {
      result = result + to
    } else {
      result = result + str[i]
    }
  }
return result
}

// ******
// 해설 듣고 수정하기
// 페어랑 문제해결
function replaceAll(str, from, to) {
  let result = '';                         // string 타입의 문자열
  for (let i = 0; i<str.length; i++){      // 문자열은 0부터 시작 
   if (str[i] === from) {                  // 문자 중 from과 같다면
   result = result + to;                   // ''+ to로 변경 -> 'to' 로 변경
   } else {                                // 그 외
     result = result + str[i];             // '' + 원래 문자
   }
  }
    return result;
  
}

isPrime

문제

1 이상의 자연수를 입력받아 소수(prime number)인지 여부를 리턴해야 합니다.

입출력 예시

let output = isPrime(2);
console.log(output); // --> true

output = isPrime(6);
console.log(output); // --> false

output = isPrime(17);
console.log(output); // --> true

----

//페어랑 문제해결
function isPrime(num) {
  if (num === 1){                     // 소수는 1보다 커야한다.
  return false;}                      // 2를 제외한 짝수는 소수가 아니다. (2는 소수)
  if (num === 2){                     
  return true;}
  if (num%2 === 0){
  return false;}


let result = Math.sqrt(num);                  //Math.sqrt(x)	x의 제곱근
  for (let i=3; i<result; i++){               // 소수의 정의 1하고만 나눠지는 숫자
   if(num%i === 0){
   return false;
}
}
  return true;                               //****************
}

선생님 해석

// 수학에서 1과 그수 자신 이외에는 자연수로 나눌 수 없는, 1보다 큰 자연수
// 1. 소수는 1보다 커야 한다.
// 2. 2를 제외한 짝수는 소수가 아니다 (2는 소수)
// 3. 3부터 자기 자신 '전'까지 나누어 떨어지는 수가 하나라도 있으면, 소수가 아니다.
function isPrime(num) {
  // 제곱근 Math.sqrt()
  let sqrt = Math.sqrt(num);
  // 1이면 소수가 아니다.
  if (num === 1) {
    return false;
  }
  // 짝수는 소수가 아니다 (2를 제외하고)
  if (num === 2) {
    return true;
  }
  if (num % 2 === 0) {
    return false;
  }
  // 3. 3부터 자기 자신 '전'까지 나누어 떨어지는 수가 하나라도 있으면, 소수가 아니다.
  for (let i = 3; i < sqrt; i++) {
    // num = 12
    // 1 * 12
    // 2 * 6
    // 3 * 4
    // 12의 제곱근 * 12의 제곱근
    // 4 * 3
    // 6 * 2
    // 12 * 1
    if (num % i === 0) {
      return false;
    }
  }
  return true;
}

listPrimes

문제

2 이상의 자연수를 입력받아 2부터 해당 수까지의 소수(prime number)들을 리턴해야 합니다.

입출력 예시

let output = listPrimes(2);
console.log(output); // --> '2'

output = listPrimes(6);
console.log(output); // --> '2-3-5'

output = listPrimes(18);
console.log(output); // --> '2-3-5-7-11-13-17'

선생님 해석 본

function listPrimes(num) {
  // 이중반복문
  // 9번 문제는 그냥 어떤 수가 소수인지 판단
  // 문자열을 리턴
  // ex) num = 12, '2-3-5-7-11'
  // 외부 반복문 : 2부터 자기자신(num)까지 반복하면서 이 수가 소수인지 판단
  // 내부 반복문 : 이 수가 소수인지 판단 (9번 문제)
  let result = '2';
  for (let i = 3; i <= num; i += 2) {
    let isPrime = true;
    // sqrt 사용해도 됩니다.
    for (let j = 3; j < i; j++) {
      if (i % j === 0) {
        isPrime = false;
      }
    }
    // isPrime인 true인 경우도 있고, false인 경우도 있음
    // 조건을 다시 분기해서, 만약에 true면, (소수면) result에 더해준다.
    if (isPrime === true) {
      result = `${result}-${i}`
    }
  }
  return result;
}

makePermutations

문제

문자열을 입력받아 해당 문자열에 등장하는 각 문자(letter)를 가지고 만들 수 있는 길이 2의 문자열들을 리턴해야 합니다.

입출력 예시

let output = makePermutations('ab');
console.log(output); // --> 'aa,ab,ba,bb'

output = makePermutations('123');
console.log(output); // --> '11,12,13,21,22,23,31,32,33'

output = makePermutations('');
console.log(output); // --> ''
// 페어랑 문제 풀이

function makePermutations(str) {
  let result = '';                                  // string 타입으로 리턴
  for (let i = 0; i<str.length; i++){               // string 타입 이기 때문에 str.legth
    for (let j = 0; j<str.length; j++){             // 00,01 두자리 숫자 사용하기 위한 이중반복문
      result = result + `${str[i]}${str[j]},`;      // '' + 문자 + ,
      // i = 0 j = 0 -> '11,'
      // i = 0 j = 1 -> '11,12,'
      // i = 0 j = 2 -> '11,12,13,'
      // i = 1 j = 0 -> '11,12,13,21,'
    }
  }
  return result.slice(0,result.length -1);           // 결과 값에 slice(0,길이) 사용
  // 잘라내기 마지막 ,를 없애기 위해 마지막 -1 를 넣어준다.
}

선생님 해석 본

function makePermutations(str) {
  // 문자열을 입력받아 해당 문자열에 등장하는 각 문자(letter)를 가지고 만들 수 있는 길이 2의 문자열들을 리턴해야 합니다.
  // 입력: '123'
  // 출력: '11,12,13,21,22,23,31,32,33'
    // 주사위 생각나면 good!
  let result = '';
  for(let i = 0; i < str.length; i++) {
    for(let j = 0; j < str.length; j++) {
      result = result + `${str[i]}${str[j]},`
      // i = 0, j = 0 -> '11'
      // i = 0, j = 1 -> '11,12'
      // i = 0, j = 2 -> '11,12,13'
      // i = 1, j = 0
      // i = 1, j = 1
      // i = 1m 
    }
  }
  // '1234' -> 길이 4
  // '1234'.slice(0, 3)
  return result.slice(0, result.length - 1);
  // 잘라내기
}

hasRepeatedCharacter

문제

문자열을 입력받아 해당 문자열에 중복된 문자(letter)가 존재하는지 여부를 리턴해야 합니다.

입출력 예시

let output = hasRepeatedCharacter('abcdefg');
console.log(output); // --> false

output = hasRepeatedCharacter('codestates');
console.log(output); // --> true

output = hasRepeatedCharacter('');
console.log(output); // --> false
// 페어랑 해결 본
function hasRepeatedCharacter(str) {
 for (let i = 0; i<str.length; i++){                  // 스트링 타입 str.length
   for (let j = 1+i; j<str.length; j++){              // 두개의 검사를 위한 이중 반복문
     if (str[i] === str[j]){                          // i = j 이면 안됨
       return true;                                   // i 랑 j 랑 동일하지 않을경우, 영문이 같으면 트루
     }
   }
 }
 return false;                                        // 아닐경우 false
}


//********** *

선생님 해석 본

function hasRepeatedCharacter(str) {
  // 입력: 'codestates'
  // 출력: boolean타입

  // 첫번째 문자랑, 두번째 문자 비교
  // 첫번째 문자랑, 세번째 문자 비교
  // 첫번째 문자랑, 네번째 비교...
  // ...
  // 마지막에서 앞 문자랑, 마지막 문자 비교

  for (let i = 0; i < str.length; i++) { // str전체 순회
    // i = 0, str[0] => 'c'
    // j = 4, str[0] => 's'
    // ..
    for (let j = i + 1; j < str.length; j++) {
      // i = 9
      // j = 10
      if(str[i] === str[j]) {
        return true;
      }
    }
  }
  return false;
}

makeMarginalString

문제

문자열을 입력받아 해당 문자열을 처음부터 한 글자(letter)씩 다시 작성하려고 합니다. 이 때, 한 글자를 추가할 때마다 부분적으로 완성된 문자열을 전부 이어붙인 문자열을 리턴해야 합니다.

입출력 예시

let output = makeMarginalString('abc');
console.log(output); // --> 'aababc'

output = makeMarginalString('flower');
console.log(output); // --> 'fflfloflowfloweflower'

output = makeMarginalString('');
console.log(output); // --> ''
function makeMarginalString(str) {                     
  let result = '';
  for (let i = 0; i<str.length; i++){
    for (let j = 0; j<=i; j++){                         
      result = result + str[j];
      // i = 0, j = 0 -> str[j] 'f'
      // i = 0 j = 1 -> str[j] => 내부 반복문 종료
      // i = 1 j = 0 -> str[j] => 'f' -> 'ff'
      // i = 1 j = 1 -> str[j] => 'l; -> 'ffl'
    }
  }
  return result;
}

선생님 해석 본

function makeMarginalString(str) {
  // 입력: 'flower' -> string타입의 문자열
  // 출력: 'fflfloflowfloweflower' -> 한 글자를 추가할 때마다 부분적으로 완성된 문자열을 전부 이어붙여서 리턴
  // 0: ''
  // 1: 'f'
  // 2: 'f' + 'fl'
  // 3: 'f' + 'fl' + 'flo'
  // ...
  // 6: f + fl + flo + flow + flowe + flower
  let result = '';
  //첫번째 반복문은 반복횟수 결정 -> str의 길이
  for (let i = 0; i < str.length; i++) {
    //두번째 반복문 -> 몇 개의 문자를 더해줄건지
    for(let j = 0; j <= i; j++) {
      result = result + str[j]
      // i = 0, j = 0 => str[j] 'f'
      // i = 0, j = 1 => 내부 반복문 종료
      // i = 1, j = 0 => str[j] 'f'  'ff'
      // i = 1, j = 1 => str[j] 'l'  'ffl'
      // i = 1, j = 2 => 내부 반복문 종료
      // ...
      // i = 5, j = 5 => str[j] 'r' 'fflfloflowfloweflower'
    }
  }
  return result;
}

 

 

문제를 봤을 때 이해가 안가는 부분들이 많았지만 의사코드를 통해 어떻게 해결해 나갈지에 대해 꼭 생각해야겠다.

다양한 내장객체를 어떤식으로 사용할지에 대해 잘 생각해야 한다.

조건문과 반복문이 여러개가 쌓일 수록 어떻게 돌아가는 지 잘 생각해야 한다.

 

'Learn > Javascript' 카테고리의 다른 글

스코프 정리  (0) 2023.01.03
원시 자료형과 참조 자료형 정리  (0) 2023.01.02
객체 정리  (0) 2022.12.31
배열 정리  (0) 2022.12.29
조건문 어려운 문제 피드백  (0) 2022.12.19