반복문과 네번째 데이트

야 나 개 ·2021년 10월 12일
0
post-thumbnail

안녕 ~~~
우리 이제 결판을 내야되지 않겠어?

네번정도 만나보면 다 알잖아~~ ㅇㅈ?

그럼 가봅시다

17번 문제

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

  // TODO: 여기에 코드를 작성합니다.
  // 소수는 자기자신 수외 나눠어 떨어지지 않는 수를 의미함 
  // 1, 2는 특수 케이스 이고, 2로 나눠 떨어지는 경우는 먼저 제외시키도록 하자
  // 1은 소수가 아니고 1이다. 1은1이다 왜냐하면 자기자신외 나눌수가 없다. 

 function isPrime(num) {
  // TODO: 여기에 코드를 작성합니다.
  if(num === 1){
    return false;
  }
  if(num === 2){
    return true;
  }
  if(num%2 === 0){
    return false;
  }
  
  let square = Math.sqrt(num)  // 코드 최적화를 과정임 소수는 굳이 굳이 모든수를 찾을필요 없어 형들아 ㅋㅋㅋㅋ소수는 생각보다 쪼금밖에 없음 그래서 제곱근을 이용해서 찾을 범위를 확 줄여벼려 

  for(let i = 3; i < square; i += 2){
    if(num % i === 0){
      return false;
     }
  } return true
} 

형님들 조금 이해하심?

혹시 제곱근 모르는 형님들을 위해 정수에 루트를 씌운 값

x값에 4를 넣으면 2가 되고 , 16을 넣으면 4가 되고 굳이 전부 찾지 말라는거지

여기서 내가 진짜로 하고 싶은말은.!!!!!!!

코드 최적화 !!!!!

앞으로 이 작업이 굉장히 여러울꺼야 ...(월급받는 이유임~~ ㅇㅈ?)
솔까 이런건 많이 접해야해 엉덩이 싸움이지 !!

앞으로 좀더 다양한 함수기능들을 배울꺼야 그럼 더 쉬움 ~~ 그걸 쓰기위해선 이해해야 쓸수 있어서 이런 문법 문제들이 필요해

그럼 다음 문제로 넘어갈께

18번 문제

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

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

이문제는 마지막으로 할께 먼제 19번부터 시작하자


이중반복문 스킬 좀 살짝 배우자

이중반복문

구구단 기억나? (벌써 타자치기 귀찮음...) 벌써 이해됐지? ㅋㅋㅋ

2*1 = 2
2*2 = 4
2*3 = 6
2*4 = 8 
2*5 = 10 
2*6 = 12
2*7 = 14
2*8 = 16 
2*9 = 18 

앞자리가 i 고
뒷자리가 j 야

구구단 구하는 이중반복문을 사용해볼께.

function 구구단(num){

 let 구구단값 = 1;
  
for(let i=num; i <= num; i++){  // 앞자리 반복
 for(let j=1; j < num; i++){   // 뒷자리 반복 
   구구단값 = 구구단값 + (i*j); 
 }
}return 구구단값 
}

살짝 이해갔지? ㅋㅋㅋㅋ
솔직히 예제문제가 너무 쉬우면 이해는 되는데 응용이 안됨 ㅋㅋㅋ
그럼 당신은 휴먼임

19번 문제

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

출력
string 타입을 리턴해야 합니다.
입력받은 문자열의 각 문자를 0, 1, 2, ..., n이라고 할 경우, 00,01,02,...,nn 형식으로 리턴해야 합니다.

function makePermutations(str) {
  // TODO: 여기에 코드를 작성합니다.
  // 첫번째 반복문이 한번 돌고
  // 두번째 반복문이 전부 돈다 
  // 그리고 첫번째 반복문이 2번째로 돌면 또 두번째반복문이 입력된다. 
  // 이중반복문에 들어갈 매개변수는 달라야한다~~ 겹치면 오류난다잉 

  let result = '';
  for(let i = 0; i < str.length; i++){
    for(let j = 0; j < str.length; j++){
      result = result + str[i] + str[j]+',';
    }
  }return result.slice(0,result.length-1); 
}// 마지막에 쉼표 없애주는 스킬 ~~~ 넥슬라이스 오예 ㅋㅋㅋ 

위 코드 전부 이해 됐지? ㅋㅋㅋㅋ혹시 아직도 슬라이스 모르는 잼민이를 위해 문자열 이거 클릭해봥 내가 이거 진짜 많이 쓴다고 했니 안했니~~~ㅋㅋ

20번 문제

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

에러코드 부터 보여줄께 (난 이런걸 관성력이라고 할께. 생각없이 치는 코드 )
이중반복문의 이해못한사람들은 공감눌러라

function hasRepeatedCharacter(str) {
  // TODO: 여기에 코드를 작성합니다.

  for(let i = 0; i < str.length; i++){
    for(let j = 0; j < str.length; j++){ // 비교대상이 똑같음... 거울보고 가위바위보 해서 이겨야 하는거야 하...
      if(str[i] === str[j]){
        return true;
      } 
    } 
  } return false;

}

이중반복문의 주의할점은 시작점이랑 범위를 잘생각해야해 ~~~ ㅇㅋ?
응용력 오지게 발휘해야해 !!!!! ㅋㅋㅋ

정답코드

function hasRepeatedCharacter(str) {
  // TODO: 여기에 코드를 작성합니다.

  for(let i = 0; i < str.length; i++){
    for(let j = i+1; j <= str.length; j++){
      if(str[i] === str[j]){
        return true;
      } 
    } 
  } return false;

그리고 응용력 폭발 문제 진짜 이번엔 생각좀 하면서 하자

21번 문제

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

주의 사항
이중 반복문(double for loop)을 사용해야 합니다.
str.slice, str.substr, str.substring 사용은 금지됩니다.
빈 문자열을 입력받은 경우에는 빈 문자열을 리턴해야 합니다

이번에도 에러코드부터 보여줄께 이중반복문 아직도 모르는 잼민이를 위해

function makeMarginalString(str) {
  // TODO: 여기에 코드를 작성합니다.
  let result = '';
  for(let i = 0; i < str.length; i++){
    for(let j = 0; j < str.length; j++){
      result = result + str[i] + str[j];
    }
  } return result;
}

이렇게 입력하면 어떻게 되겠어????

 'cat'() 입력받은 경우, 'ccacat'() 리턴해야 합니다
Test Result
AssertionError: expected 'cccactacaaattctatt' // 이렇게됨 

그래서 반복문을 살짝 응용해야함

function makeMarginalString(str) {
  // TODO: 여기에 코드를 작성합니다.
  // 1
  // 12
  // 123 
  // 1234 이런식으로 보여줘야함 (근데 i랑 j를 둘다 보여주면 안됨, j만 보여주자)

  let result = '';
  for(let i = 0; i <= str.length; i++){
    for(let j = 0; j < i; j++){ // j의 조건을 i의 조건에 종속시킴 
      result = result + str[j];
    }
  } return result;
}

살짝 많이 어려웠을꺼야 내가 이렇게 바로 코드를 보여줘서 그렇지 쉬워보이지?
잼민이들은 포기했지...(사실 이 글까지 보지도 않음 ㅋㅋㅋㅋㅋ)

그럼 이제 나만의 이중반복문 꿀팁 간다~(이건 진짜 별풍 400개 받아야 알려주는데)

먼저 일단 기본틀을 적어!!!! (아무리 수도코드대로 적어도 정말 힘들어) 일단 적고 여기서 부터 하나씩 전달인자를 넣어가면서 생각해보자~~!!!

 for(let i = 0; i < str.length; i++){
    for(let j = 0; j < str.length; j++){

이렇게 수정

 for(let i = 0; i <= str.length; i++){
    for(let j = 0; j < i; j++){

와 닿았다면 !! 아까 풀지 않은 18번 문제로 갈께 ㅋㅋㅋ 이걸 끝으로 반복문은 마스터 한거다!!

18번 문제

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

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

바로 정답코드 쏘고 싶은데 .........

정답만 빼가는 잼민이들 때문에 설명부터 한다!
그리고 복습겸 2가지 스킬정리 한다.

첫번째 스킬
if(조건문임 참이면 작동됨)
조건문이 굳이 없어도됨 그냥 true면 작동 false면 작동 안함
그래서 if(true)넣으면 작동됨 이해완료? ㅋㅋㅋ

두번째 스킬
반복문은 중간에 조건만 맞으면 멈출도 있음 break
그리고 중간에 이건 빼고 반복도 가능 continue

스킬이라도 할것도 없지만
이래야 주목할테니....

간단하게 그림을 그려보면

차례대로 숫자가 소수이면 조건문을 작동시키고
아니면 멈춘다!!

( 반복문 + 조건문 ) + (반복문 + 조건문) + 출력값

function listPrimes(num) {
  let result = '2'; //요구하는 값은 2부터 시작이니 2부터 한다.

  for(let i = 3; i <= num; i++){ 
    let isPrime = true 
    for(let j = 2; j < i; j++){
      if( i % j === 0){
      isPrime = false // 두번째 반복문은 소수가 아니면 조건문 스탑 
      break; // 그리고 멈추고 첫번째 반복문은 시작하자 !! 
      } 
    } 
   if (isPrime){   // 그리고 참일때만 아래 식이 작동된다. 
    result = result + '-' + i
   }
  } 
  return result; 
}

어때 형들, 잼민아..ㅋㅋㅋㅋㅋ 할만 하지? ㅋㅋㅋㅋ

진짜 처음 보는 분들은 여러울꺼야

내가 쉽게 재미나게 최대한 풀어봤어 이해못했으면 내가 잘 설명 못한거야 ㅋㅋㅋㅋ 그러니 날탓해 ㅋㅋㅋ

(나만 잘해야징 !!히히히ㅣ히 ㅋㅋㅋㅋㅋㅋ 농담임)

정말 궁금하면 댓글줘 친절히 설명해줄께.!!

그럼 다음 세상에서 제일 쉬운 배열,객체에서 보자

객체지향이 뭔지도 알려줄테니 ㅋㅋ

미리 스포일러 하면
[1,2,3,4,5]
{이름 : '홍길동',
나이 : '23세',
직업 : '의적',}

뭐 이런거야 ㅋㅋㅋ

e

profile
야 나도 개발자 될 수 있어

0개의 댓글