본문 바로가기
인프런/Java Script

22.03.04 반복문 While, for / break, continue / 중첩 반복문 / 별찍기 숙제

by h.단디 2022. 3. 5.

[리뉴얼] 렛츠기릿 자바스크립트

교재 : https://thebook.io/080270/part01/ch02/05/

 

 

반복문(while)

 - 반복작업을 잘 시켜야 효율적인 프로그래밍 !

 - 무한 반복으로 하면 컴퓨터 뻗는다잉 -> 무한 반복되는 상황을 방지해야함

 - 실수로 웹브라우저에서 무한 반복 실행해버렸다면? 새 탭 켜고 기존 탭은 종료.

while (조건식) {
  실행문1;
  실행문2;
  실행문3;
}

 ▶ 조건식이 true동안 실행문 반복해서 실행함. 

 

  • [퀴즈]hello, world! 100번만 반복하기

내 답)

let i = 1
while (i<=100) {
    i = i + 1;
    console.log ('Hello world!')
}

쌤 답)

let i = 1;
  while (i <= 100) {
    console.log('Hello, while!');
    i++;
  }

 - i=i +1    / i+=1    /    i++   같다고 생각하면 됨.(엄밀히는 다르지만..)

 

 

헐 대박

let i = 1
while (i<=100) {
    console.log ('Hello world!')
    i = i + 1;
}

하니까 100번 실행하고 101이라는 결과값 돌려줌

 

 - 프로그래밍할 때는 i의 초기값을 0을 주로 설정함. 이 경우 위의 예제에서 조건식을 i<=99 나 i<100으로 바꿔야겠지?

 

 


반복문(for)

for (시작; 조건식; 종료식)
  실행문;

 - 실행순서 : 시작 > 조건식 > 동작문 > 종료식 > 조건식 > 동작문 > 종료식 > ... > 조건식이 참인동안 계속 반복

 

 - for문의 반복문 요소들은 생략이 가능해서

> for (;;) {
  }

도 가능하지만, 이 경우 항상 true이기 때문에 무한 반복됨;

 

 

while문과 for문 비교

 - while문 : 반복문 요소들(시작, 조건식, 종료식)이 흩어져있어서 조건식&종료식 사이의 코드가 길어지면 가독성이 떨어짐. 더 편한 경우도 있음!

 - for문 : 처음에 반복문 요소들을 한번에 모아서 명시하기 때문에 가독성 좋음. 

 

  • [퀴즈] 1~100까지 출력해보기 

쉽게 가면

for (i=1;i<=100;i++){
    console.log(i)
}

지만

정석대로는 

for (i=0;i<100;i++){
    console.log(i+1);
}

 

프로그래머들은 반복문 작성하면서 i가 어떻게 변하는지 머릿속으로 자연스레 생각함. 초보자 단계에서는 눈으로만 따라가지 말고 직접 노트에 i가 변하는 걸 써보면서 진짜 사고 방식을 따라할 수 있게 노력해야함! 중요!

 

 


break와 continue

 - 반복문 노트에 적어보는 습관!

for (let i=0;i<100;i=i+2){
    console.log(i+1);
}

//i==0, i+1==1
//i==2, i+1==3
//i==4, i+1==5
//i==98, i+1==99
//i==100? 조건 false 끝 

이런 식으로 적어보는 거임!

 

break문

 - 자연수, 실수 전체를 대상으로 반복문 돌려서 값을 하나씩 찾다가 원하는 값 찾으면 반복문 멈출 때. 

let i = 0;
  while (true) {
    if (i === 5) break;
    i++;
  }
  console.log(i);

// i==0, i++==1
// i==1, i++==2
// i==2, i++==3
// i==3, i++==4
// i==5 break, 5

 - break를 이용하여 무한반복문을 실행할 때는 while문을 써주는걸 추천. for문을 무한반복으로 쓰려면 조건식이 빈값이어서 좀 ..어색하니까? 반면에 while문에서는 조건을 (true)라고 해주면 됨. 사실 웬만하면 무한반복문을 쓰지 않는데, 무한반복문이 보인다? 그럼 어딘가에 break가 들어가있을 가능성이 큼!

let i = 0;
while (true) {
  console.log(i);
  i++;
}
for (let i = 0; ; i++) {
  console.log(i);
}

 

continue문

 - 반복문이 특정 조건에서만 실행되게. continue문이 실행되면 그 후의 실행문은 실행되지 않음. 

let i = 0;
  while (i < 10) { //홀수만 console.log
    i++;
    if (i % 2 === 0) { // 짝수만
      continue;
    }
    console.log(i);
  }

// i==0, i%2===0
// i==1, i%2===1, 1
// i==2, i%2===0
// i==3, i%2===1, 3
// i==9, 1%2===1, 9
// i==10, 조건 깨짐

 - 주석 다는 습관! 며칠전에 짠 코드도 내가 왜 이렇게 짰는지 모르겠을때 얼마나 답답하겠뉘!

 


 

중첩 반복문

 - for 반복문 순서에 유의해서 손으로 메모해보자

for (let i = 0; i < 5; i++) {
    if (i % 2 === 0) continue;
    for (let j = 0; j < 5; j++) {
      if (j % 2 === 0) continue;
      for (let k = 0; k < 5; k++) {
        if (k % 2 === 0) continue;
        console.log(i, j, k);
      }
    }
  }

 - 결과 노트에 손으로 메모해봤는데 확실히 이해가 잘 됨! 굿! 심심할 때 폰 게임말고 노트에 끄적여보자

 

  • [퀴즈]7 구구단을 출력하되, 결과에 짝수가 하나도 나오지 않게 해 보세요. continue 문을 사용하세요.

내 답) 홀리 몰리.. 개뿌듯..

for (let i=0;i<10;i++){
    if (i%2===0) continue;
    for (let j=0;j<10;j++){
        if(j%2===0) continue;
        console.log(i*j);
    }
    }

책 정답)

for (let i = 0; i < 10; i++) {
  for (let j = 0; j < 10; j++) {
    if (i % 2 === 0 || j % 2 === 0) continue;
    console.log(i, '*', j, '=', i * j);
  }
}

continue 없는 버전)

for (let i = 1; i < 10; i=i+2) {
  for (let j = 1; j < 10; j=j+2) {
    console.log(i, '*', j, '=', i * j);
  }
}

 

 


 

별찍기 숙제

Q1.

for (let i=0;i<5;i++){
    console.log('*'.repeat(i+1));
}

 - 문자열.repeat(숫자)    ->  문자열을 숫자만큼 반복

 

Q2.

for (let i=5;i>0;i=i-1){
    console.log('*'.repeat(i));
}

또다른 정답 (i=0 이 정석!)

for (let i=0;i<5;i++){
    console.log(5-i);
}

 

Q3.

for (i=0;i<10;i++){
    if (i%2===0) continue;
    console.log('*'.repeat(i));
}

 

Q4.

for (i=0;i<10;i++){
    if (i%2===0)continue;
    console.log('*'.repeat(10-i));
}

 

Q5.

for (i=0;i<5;i++) {
    console.log(' '.repeat(i),'*'.repeat(5-i));
}

 

Q6.

for (i=0;i<5;i++) {
    console.log(' '.repeat(5-i),'*'.repeat(i+1));
}

 

Q7.

for (i=0;i<10;i++){
    if (i%2===0) continue;
    console.log(' '.repeat((9-i)/2),'*'.repeat(i));
}

 

 

for (let i=0;i<10;i++){
    if (i%2===0)
        console.log(' '.repeat((8-i)/2),'*'.repeat(i+1));
}

마지막 어려웠다... 2번째 짝수기준으로 생각한게 더 편하다.