[JS] 반복문을 이용한 예제 - 별찍기, 구구단

AREUM·2022년 12월 21일
0

Javascript실행

목록 보기
3/7
post-thumbnail

반복문 for, while, 중첩 for, break, continue 정리글

앞서 정리 했던
while문 for문 중첩 for문 break continue 를 가지고 여러 예제인 별그리기와 구구단을 연습했다.
어떻게 왜 코드를 이렇게 짜고 했는지 내 코드를 적어볼거다.

for while 두 가지 모두로 연습했다.
나는 while문 보다 for문을 쓰기 더 편해서 for문으로 먼저 작업을 했고 그 뒤 for문을 보면서 while문을 작성했다. 그래서 문법의 차이도 보였다.

1씩 추가

// for문
for(let i=0; i<5; i++) {
  console.log(i + 1);	// 1, 2, 3, 4, 5
}

// while문
let i = 0;
while(i < 5) {
  console.log(i + 1);	// 1, 2, 3, 4, 5
  i++;
}

1씩 감소

// for문
for (let i = 5; i >= 1; i--) {
  console.log(i);	// 5, 4, 3, 2, 1
}

// while문
let i = 5;
while(i >= 1) {
  console.log(i);	// 5, 4, 3, 2, 1
  i--;
}

i가 0으로 고정 : 1씩 감소

이 예제는 생각하게 된 것은,
크게 생각해서 재활용성을 위해서 라고 할 수 있다. i가 그 상황에 맞는 값이 아닌 기본 값을 '0'으로 고정 시켰을 시에 공통적으로 사용할 수 있는 반복문을 사용하지 않을 까 이다. 아직은 제대로 많은것을 알지는 못하지만, 그냥 생각을 해보았다는 것이다.
음 아니면
'0'에 대입할 값을 i를 재할당해서 .. i를 보호 ?

// for문
for (let i = 0; i < 5; i++) {
  console.log(5 - i);	// 5, 4, 3, 2, 1
}

// while문
let i = 0;
while(i < 5) {
 console.log(5 - i);	// 5, 4, 3, 2, 1
 i++;
}

1~10 홀수만 출력 작은 순 👉🏻 큰 순

// for문 1번째 방법 : 조건문을 사용하지 않고
for (let i = 1; i < 10; i += 2) {
  console.log(i);	// 1, 3, 5, 7, 9
}
// for문 2번째 방법 : 조건문을 사용하고
for (let i = 1; i < 10; i += 2) {
  if (i % 2 === 0) {
    continue;
  }
  console.log(i);	// 1, 3, 5, 7, 9
}

// while문 1번째 방법 : 조건문을 사용하지 않고
let i = 1;
while ( i < 10 ) {
  console.log(i);	// 1, 3, 5, 7, 9
  i+=2;
}
// while문 2번째 방법 : 조건문을 사용하고
let i = 1;
while ( i < 10 ) {
  if (i % 2 === 0) {
    continue;
  }
  console.log(i);	// 1, 3, 5, 7, 9
}

1~10 홀수만 출력 큰 순 👉🏻 작은 순

// for문 : 1번째 방법
for (let i = 0; i < 9; i += 2) {
  console.log(9 - i);	// 9, 7, 5, 3, 1
}
// for문 : 2번째 방법
for (let i = 9; i > 0; i -= 2) {
  console.log(i);	// 9, 7, 5, 3, 1
}
// for문 : 3번째 방법
for (let i = 10; i > 0; i--) {
  if (i % 2 === 0) {
    continue;
  }
  console.log(i);	// 9, 7, 5, 3, 1
}

// while문 : 1번째 방법
i = 0;
while(i < 9) {
  console.log("1. 홀수 -", 9 - i)
  i+=2
}
// while문 : 2번째 방법
let i = 9;
while(i > 0) {
  console.log("2. 홀수 -", i);
  i -= 2;
}
// while문 : 3번째 방법
let i = 10;
while( i > 0 ) {
  i--;
  if(i%2 ===0) {
    continue;
  }
  console.log(i)
}

비 효율적 예

처음에 만들었었던 코드이다.

// 1 3 5 7 9
for (let i = 0; i < 10; i++) {
  while (i % 2 === 0) {
    // i를 2로 나눴을 때, 나머지가
    i++;
    console.log("1. 홀수 +", i);
    break;
  }
}
// 9 7 5 3 1
for (let i = 10; i > 0; i--) {
  while (i % 2 === 0) {
    i--;
    console.log("3. 홀수 -", i);
    break;
  }
}

이 코드가 왜 비 효율적일까 ?
for문 안에 while문이 있다. 그 말은 즉 반복문 안에 또 반복문이 있다는 말이다.
조건문으로 처리 하던가, 증감식으로 처리해도 될 문제 인데
반복문이 10번이나 돌기 때문에 매우 비 효율적인 코드이다.

for, while 별찍기

공백 Hint 👉🏻 repeat() : 문자열 반복메소드

*****
 ****
  ***
   **
    *
  
// for문
for (let i = 0; i < 5; i++) {
  console.log(" ".repeat(i) + "*".repeat(5 - i));
}
// while문
i = 0;
while(i < 5) {
  console.log(" ".repeat(i) + "*".repeat(5 - i))
  i++
}
    *
   **
  ***
 ****
*****
     
// for문
for ( let i = 0; i < 5; i++) {
  console.log(" ".repeat(4 - i) + "*".repeat(i + 1))
}
// while문
i = 0;
while(i < 5) {
  console.log(" ".repeat(4 - i) + "*".repeat(i + 1));
  i++
}
	*
   ***
  *****
 *******
*********

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

// while문
i = 0;
while(i < 9) {
  console.log(" ".repeat((9 - i) / 2) + "*".repeat(i + 1) + " ".repeat((9 - i) / 2));
  i += 2
}
j = 0;
while(j < 9) {
  if (j % 2 === 0) {
    console.log(" ".repeat((9 - j) / 2) + "*".repeat(j + 1) + " ".repeat((9 - j) / 2));
  }
  j++;
}
*********
 *******
  *****
   ***
    *
  
// for문
for (let i = 0; i < 9; i+=2) {
  console.log(" ".repeat((i + 1) / 2) + "*".repeat(9 - i) + " ".repeat((i + 1) / 2))
}

// while문
i = 0;
while(i < 9) {
  console.log(" ".repeat((i + 1) / 2) + "*".repeat(9 - i) + " ".repeat((i + 1) / 2));
  i+=2
}
// while문
j = 0;
while(j < 9) {
  if (j % 2 === 0) {
    console.log(" ".repeat((j + 1) / 2) + "*".repeat(9 - j) + " ".repeat((j + 1) / 2))
  }
  j++
}

구구단 : 1~9단

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

구구단 : 2의 배수가 들어가지 않은 구구단

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

for(i=1; i < 10; i++) {
  for(j=1; j < 10; j++) {
    if (i % 2 === 0 || j % 2 === 0) continue;
    console.log(i, j, i*j)
  }
}
/* 짝수 건너뛰기 */
i=1 j=1
i=1 j=3
i=1 j=5
i=1 j=7
i=1 j=9
...
i=3 j=1
i=3 j=3
i=3 j=5
...
i=5 j=1
i=5 j=3
i=5 j=5
...

효율적인 코드라면 좋은 코드라고 생각하고 답이 없다고 생각한다.

❗️❗️여러가지의 방법으로 답을 만들 수 있다는 법을 배웠다.❗️❗️
첫번째 코드는 증감식을 이용한 코드
두번째 코드는 조건문과 continue를 이용한 코드
세번째 코드는 두번째 코드를 활용해 연산자를 이용해서 단축해서 만든 코드

❗️공책에 적어가면서 규칙을 찾아라❗️
1. 제일 밖에 있는 for문에서 부터 조건 하나 찍고 안으로 들어간다.
2. 두번째 for문이 작동 하고 세번째 for문이 없기 때문에 두번째 for문의 조건에 맞는 10이하 전까지 ( + continue 이기 때문에 짝수의 조건은 건너 띄고 홀수만 출력된다. ) 계속 반복문이 돈다.
3. 다 돌았다면 다시 밖에 있는 for문의 조건으로 돌아가 하나의 조건을 찍고 다시 for문안으로 들어간다.
4. 안에 for문의 조건은 다시 1로 초기화되어서 다시 조건까지 맞춰 반복한다.
5. ... 무한반복
6. 첫번째 반복문의 조건이 맞춰지면 중첩반복문은 모두 종료된다.

List 만들기

for (let i=1; i<=1; i++) { 
  for(let j=1; j<=5; j++){
    let item = 'list'
    item += j
    console.log(item)	//	list1 list2 list3 list4 list5
  }
}

for (let i=1; i<=1; i++) { 
  let item = 'list'
  for(let j=1; j<=5; j++){
  	item += j
  }
  console.log(item)	// list12345
}

어떻게 하면 이해가 되는가.
: 규칙을 찾자.
1차원 적인 제어문들은 머리를 굴려서 코드를 바로 쳐볼 수 있지만, 이중 또는 복잡한 경우에는
종이에 적어가면서 하나씩 계산을 해보는것이 나중을 위해 좋을 거같고, 익숙해지면 종이에 따로 적지않고도 할 수 있지 않을까 싶다.

진짜 너무너무 어려웠다.
중첩 반복문은 조금 더 공부해 보도록 해야겠다.

사이드 프로젝트로 공용 무료 API를 사용해서
테이블을 만드는 예
목록을 만드는 예
등 여러가지를 만들어 봐야겠다.

다음은 반복문 종류들을 공부해봐야겠다. 배열연산까지..

profile
어깨빵으로 부딪혀보는 개발끄적이는 양씨 인간

0개의 댓글