이번주 복습 오답노트

김병민·2021년 4월 11일
0
post-thumbnail

오답노트

반복문

03.idOdd

수를 입력받아 홀수인지를 리턴

주의 사항

반복문(while)문을 사용해야 합니다.
for문 사용은 금지됩니다.
나눗셈(/), 나머지(%) 연산자 사용은 금지됩니다.
0은 짝수로 간주합니다.

틀린 코드

function isOdd(num) {
  // TODO: 여기에 코드를 작성합니다.
  let n = 0;
  let result = Math.abs(num)
  while(result>=0){
  result = result - n
  if(result===0){
    return false
  } else if(result!==0){
    return true
  }
  n = n -2 
}
}
//while문으로 작성
// 나누기와 %연산을 제외하고 홀수짝수를 구분할 수 있는 방법
// ex) 2,3이라는 수를 입력 받았음
//  -2를 한다면 0은 짝수 / 1을 홀수
//-2 계산을 반복함 
//  0은 짝수
// 입출력 예시를 보면 -8 값도 홀수 짝수를 나눠야함

문제점

100을 입력 받으면
AssertionError: expected true to equal false

-1000을 입력 받으면
AssertionError: expected true to equal false
값 리턴

해결책

흐음 ... n값을 없애고 result값에 직접적으로 -2를 넣어줌.
제일 큰 문제 100 값과 -1000값 근데 생각해보니
0을 제외한 모든값이 true값임

0을 제외한 모든값이 true값임 왜 why ?

else if(result!==0)라고 조건을 설정하여 0을 제외한 모든 값이 -2를 반복연산하여 답에 도달하는 것이 아닌 !==0이기 때문에 바로 true값을 출력함
-변경
else if(result!==0) --> else if(result===1)

function isOdd(num) {
  // TODO: 여기에 코드를 작성합니다.
 
  let result = Math.abs(num)
  while(result>=0){
  
  if(result===0){
    return false
  } else if(result===1){
    return true
  }
  result = result - 2
}
}

18.listPrimes

수를 입력받아 2부터 해당 수까지의 소수(prime number)들을 리턴

출력

출력
string 타입을 리턴해야 합니다.
2-3-5-7의 형식으로 리턴해야 합니다.

주의 사항

이중 반복문(double for loop)을 사용해야 합니다.

작성코드

function listPrimes(num) {
  // TODO: 여기에 코드를 작성합니다.
//수 입력
//그 수까지 모든 소수를 구함
//나눠질 수(i) 와 나누기위해 필요한 수(n) 
//단, 2부터 해당 수까지 구하는 것임으로 
//2는 무조건 소수값이됨
//2로 나눠지는 수는 모두 소수가 아님 
//3부터 판별하며 5,7,9,10 순으로 판별  +2 값 왜 why --> 짝수에는 소수가 2뿐이지만 홀수는 소수가 존재
//확인할 수는 sqrt를 사용하여 제곱근의 수의 정수까지 나눠봄
 let result = "2"
 
 for(i=3;i<=num;i=i+2){
   let truth = true 
   let sqrt = parseInt(Math.sqrt(i))
   for(n=3;n<sqrt;n=n+2){
     if(i%n===0){
       truth = false
       break
     } 
   }if(truth===true){
    result = result + "-" + i
    }
    
   }
   return result
 }

문제점

흐음 ... 너무 어려움 이거 혼자 풀 수 있는 수준이 아닙니다. 바보임에 틀림이없음 !
하 sqrt에 개념을 다시 알 필요가 있음
조건문을 넣을 때 조건의 범위를 잘 설정해야할듯
for(n=3;n<sqrt;n=n+2)
----> for(n=3;n<=sqrt;n=n+2)로 변경해야 9를 받을 시 루트 9가 되고 루트 9= 3. <로 문제를 풀시 9는 true값이 되어 result값에 넣어져 잘못된 값을 출력 ! <=로 설정하고 풀어여 루트9=3/ 3은 n=3값으로 나눠져서 false값을 출력하고 result값에 포함되지 않음

정답

function listPrimes(num) {
 // TODO: 여기에 코드를 작성합니다.
//수 입력
//그 수까지 모든 소수를 구함
//나눠질 수(i) 와 나누기위해 필요한 수(n) 
//단, 2부터 해당 수까지 구하는 것임으로 
//2는 무조건 소수값이됨
//2로 나눠지는 수는 모두 소수가 아님 
//3부터 판별하며 5,7,9,10 순으로 판별  +2 값 왜 why --> 짝수에는 소수가 2뿐이지만 홀수는 소수가 존재
//확인할 수는 sqrt를 사용하여 제곱근의 수의 정수까지 나눠봄
let result = "2"

for(i=3;i<=num;i=i+2){
  let truth = true 
  let sqrt = parseInt(Math.sqrt(i))
  for(n=3;n<=sqrt;n=n+2){
    if(i%n===0){
      truth = false
      break
    } 
  }
  if(truth===true){
   result = result + "-" + i
   }
   
  }
  return result
}

19.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) {
  // TODO: 여기에 코드를 작성합니다.
  let result = ""
for(i=0;i<=str.length;i= i +1){
  for(n=0;n<=str.length;n= n +1){
    result = result + str[i]+str[n] + ","
  }
}
 return result
}
// asd를 입력받을때
//반복문을 사용하여 첫번째 문자를 고정하고 두번째 문자에는 첫번째 문자를 출력합니다
// 두번째에는 첫번째 문자는 그대로 고정을 하고 두번째 문짜를 가지고 옵니다.
// 세번째에는 첫번째 문자는 고정 세번째 문자를 갖고옵니다.
//반복문 for문을 사용하여 i에 초기값을 0으로 두고 문자열의 길이만큼 반복, i는 +1만큼 상승합니다.
// 두번째 반복문 for에는 n은 0부터 문자열의 총 길이만큼 반복하면 +1만큼 상승합니다.
// 출력물은 리절트값에 넘깁니다.
//리저트값을 리턴합니다.
//

문제점

첫번째는 또 잘못된 범위값을 설정함 !
  <=가 아닌 < or str.length-1로 설정해야함
  왜 why ? --> 문자열은 0부터 위치를 시작함!!

또한, 출력물 마지막에 ,문자가 붙음 !

답 !

function makePermutations(str) {
  // TODO: 여기에 코드를 작성합니다.
  let result = ""
for(i=0;i<str.length;i= i +1){
  for(n=0;n<str.length;n= n +1){
    result = result + str[i]+str[n] + ","
  }
}
 return result.slice(0,result.length-1)
}
// asd를 입력받을때
//반복문을 사용하여 첫번째 문자를 고정하고 두번째 문자에는 첫번째 문자를 출력합니다
// 두번째에는 첫번째 문자는 그대로 고정을 하고 두번째 문짜를 가지고 옵니다.
// 세번째에는 첫번째 문자는 고정 세번째 문자를 갖고옵니다.
//반복문 for문을 사용하여 i에 초기값을 0으로 두고 문자열의 길이만큼 반복, i는 +1만큼 상승합니다.
// 두번째 반복문 for에는 n은 0부터 문자열의 총 길이만큼 반복하면 +1만큼 상승합니다.
// 출력물은 리절트값에 넘깁니다.
//리저트값을 리턴합니다.
//
profile
I'm beginner

0개의 댓글