반복문

Yein Moon·2021년 6월 17일
0

개발일지

목록 보기
5/21
post-thumbnail

1. 반복문

1. for

let 반복요소;
for(let i = 초기값; i <= 조건; i= i+증감){
  반복요소 = 반복요소 + i;
  //(또는)
  어떠한 반복내용
}

2. while

let 반복요소;
let 초기값 = 초기할당값;

while(i<=조건){
  반복요소 = 반복요소 + i;
  //(또는)
  어떠한 반복내용
  i = i + 증감;
}
  • forwhile의 가장 큰 차이는 초기값과 증감문의 필수 여부이다.



반복문 문제를 풀어보자

오늘은 pseudo code를 좀 더 신경써보겠따.

Q1. 문자열에서 '#'의 인덱스를 리턴

  • '#'이 없는 경우 undefined 리턴
function findTheHashtag{
  for(let i=0; i<word.length; i++){ //입력받은 문자열의 첫 인덱스부터 끝까지 확인하겠다
    if(word[i] === '#'){ // 각 인덱스의 문자가 #인지를
      return i; // 만약 그렇다면 그 인덱스 번호를 반환하자
    }
  } return undefined; // 모든 인덱스를 둘러봐도 없으면 undefined를 반환한다
}

Check 👉🏾 이게 웬만한 반복문의 근간이 되더라..


Q3. 입력된 수가 홀수인지 확인

  • while 사용
  • 0은 짝수로 간주
  • 나눗셈, 몫 연산자 사용 금지
function isOdd(num){
  if(num < 0){
    num = -num;
  }
  
  while(num >= 0){
    num = num - 2; 
    if(num === 1){
      return true;
    }
  } return false;
}

//위 while문은 아래처럼 바꿀 수 있다
  
  while(num>=0){ //(while구문) 0 보다 클때 , (조건문) num 1일 때는 ture 리턴, 0일때는 false 리턴하기
    if(num === 1){
      return true;
    } else if(num === 0){ 
      return false;
    }
    num = num - 2; //-2씩 빼서 0인지 아닌지 확인 해보기!
  }

Check 👉🏾 특정 연산자를 사용 못하면 제일 무식한 방법이 컴퓨터가 처리하는 과정이다! (홀수 찾기 = 계속 2씩 빼서 나머지 확인하기)


Q7. 1부터 num까지 정수로 구성된 문자열

  • while 사용
  • 숫자 사이 '-'로 구분
function makeDigits2(num){
  let string = '1';
  let i = 2;
  
  while(i<=num){
    string += `-${String(i)}`;
    i++;
  }
  return string;
}

Check 👉🏾 표현식 포함한 문자열 ${} 에 익숙해지자!


Q10. 두 수를 입력받아 두 수를 포함해 그 사이의 수 중 2의 배수의 개수를 리턴하라

  • for문 사용
  • numnum2 대소관계는 모름
  • 0은 2의 배수가 아니라고 가정
function makeMultiplesOfDigit2(num1, num2){
  let count = 0;
  let start = Math.min(num1, num2);
  let end = Math.max(num1, num2);
  // 반환할 개수 변수, 시작값, 끝값을 선언한다
  // num1과 num2 대소 비교해 시작값과 끝값에 할당한다
  
  for(i=start; i<=end; i++){ // 2의 배수를 찾는 for문을 만든다
    if(i % 2 === 0 && i !== 0){ // 0을 제외하는 구문을 &&로 추가한다
      count++
    }
  }return count;
}

Check 👉🏾 사용할 수 있는 Method가 있으면 적극 활용하자
Check 👉🏾 예외가 있다면 아예 따로 if문을 만들기보단 !을 이용, 추가하여 예외처리 해주자


[주말에다시]Q18. 1 이상의 자연수를 입력받아 2부터 해당 수까지의 소수들을 리턴하라

  • num >= 2
  • string 타입, 2-3-5-7 형식으로 리턴
function listPrimes(num){
  let result = '2'; // 일단 2는 무조건 소수이니 시작값으로 넣고 시작
  
  for(let i=3; i<=num; i++){ // 3부터 하나씩 소수인지 확인한다
    for(j=2; j<i; j++){ // 그 방법은 i를 2부터 i-1까지의 값으로 나누어보는 것이다
      isPrime = true; // 우선 소수인지 나타내는 변수를 지정하고 true를 할당한다
      if(i%j === 0){ // 만약 어떤 값으로 나눈 값이 0이라면
        isPrime = false; // 할당했던 true는 false가 되고
        break; // 더 볼것도 없이 break로 while문을 끝내면 된다
      }
    }
    if(isPrime){ // break로 안빠지고 쭉 isPrime이 true로 남는다면
      result += `-${i}`; // result에 '-추가될소수'를 string으로 추가한다
    }
  }
  return result;
}

Check 👉🏾 for문을 더 간략화해보자.

1. i 증감을 +1이 아닌 +2로 할 수 있다.
: 짝수는 이미 2를 약수로 가지니 시작값 3부터 홀수만 보면 된다.

2. j는 i의 제곱근 범위까지만 확인하면 된다.

  • 소수가 아닌 수는, 1*자신/ 2nd작은수*2nd큰수 / 3rd작은수*3rd큰수 ... 를 약수로 가진다.
  • 즉, nth 작은수만 확인되면 어차피 소수가 아닌 것이다.
  • 1*자신/ 2nd작은수*2nd큰수 / 3rd작은수*3rd큰수 ...에서 중간은 제곱근*제곱근이므로, 절반 지점인 제곱근까지만 보면 된다!

따라서, 아래와 같이 반복문을 간략화 할 수 있다.

for(let i=3; i<num; i+=2){
  for(let j=2; j<=Math.sqrt(i); j++){
    if(i%j ===0){
      isPrime = false;
      break;
    }
  }
}

Q19. 문자열에 등장하는 각 문자로 길이 2의 문자열들을 나열해 리턴하라.

  • 입력받은 문자열이 abc라면, aa,ab,ac,ba,bb,bc,ca,cb,cc
function makePermutations(str){
  let result = ''; // 반환할 결과값 변수 선언
  
  for(let i=0; i<str.length; i++){ // result = left + right라고 생각하고 이중 for문 구성
    for(let j=0; j<str.length; j++){ 
      result = result + `,${str[i]}${str[j]}`; // 앞에 콤마를 더해 계속 붙여준다
    }
  }
  return result.substring[1]; // 마지막 반환 때 맨 처음 콤마만 삭제한다
}

Check 👉🏾 반복되는 규칙에서 예외가 있을 때 (이 문제에서는 맨 첫 콤마) 맨 처음에 빼줄 수 있는지 마지막에 없애야하는지 생각해보고 방도를 찾는다.


Q20. 문자열에 속에 중복되는 문자가 있는지 확인하라.

  • 중복 문자열이 있는 경우 true 반환
  • 빈 문자열을 입력받는 경우 false 반환
function hasRepeatedCharacter(str){
  
  for(let i=0; i<str.length; i++){
    for(let j=i+1; j<str.length; j++){
      if(str[i] === str[j] && str.length !== 0){
        return true;
      }
    }
  }return false;
}

Check 👉🏾 중간 조건문에 return true;가 있는 이런 문제.. return false;는 어디로 빼야할지 항상 고민된다.


[주말에다시]Q21. 문자열에 속 문자를 한 글자씩 다시 작성하는데 부분적으로 완성된 문자열을 전부 이어붙여 리턴하라.

  • abc를 입력받았을 때 aababc 반환
  • 빈 문자열을 입력받은 경우 빈 문자열을 리턴
function makeMarginalString(str){
  let result ='';
  
  for(let i=0; i<str.length; i++){ // 기준으로 할 문자열 선택
    for(let j=0; j<=i; j++){ // 기준 문자열보다 앞에 있는 것을 계속 쭉 적어준다
      result += str[j];
    }
  }return result;
}

Check 👉🏾 나는 a, ab, abc를 만들어 이어주는 두 단계로 생각했었는데 완전 잘못생각한거였다..


profile
마스크 벗을 때쯤엔 주니어개발자 될끄니까

0개의 댓글