[자바스크립트 연습문제] 13 풀이

이번 글은 연습문제 풀이입니다. 이전 글에서 연습문제를 풀어 보신 분들만 아래 내용을 확인하시길 바랍니다.






13-1 풀이

for(var i=0; i<5; i++){

  var string = "";

  for(var j=0; j<5-i; j++){
    string = string+"*";
  }

  console.log(string);
}

전체 줄수가 5이고, i가 현재 줄의 번호이므로 각 줄당 5-i개의 별을 찍어주면 됩니다.

13-2 풀이

for(var i=0; i<5; i++){

  var string = "";

  for(var j=0; j<i; j++){
    string = string+" ";
  }

  for(var j=0; j<5-i; j++){
    string = string+"*";
  }

  console.log(string);
}

첫째줄에는 빈칸이 0칸, 별이 5칸, 둘째 줄에는 빈칸이 1칸, 별이 4칸 ... 즉 빈칸을 줄 번호-1(j<=i-1이 되고, 이것은 j<i와 같죠)만큼 먼저 찍어 준 다음, 별을 줄 번호의 반대로 찍어주면 되겠죠.

위 풀이에서는 for문 안에 2개의 for문을 사용했는데, 하나만 사용할 수도 있습니다.

for(var i=0; i<5; i++){

  var string = "";

  for(var j=0; j<5; j++){
    if(j<i){
      string = string+" ";
    }
    else {
      string = string+"*";
    }
  }

  console.log(string);
}

별찍기 예제를 처음 보시는 분들은 쉽게 이해가 잘 안되실 텐데, 노트에 i와 j의 값을 기록해 가면서 차근차근 코드를 따라 반목문을 진행해 봅시다. 저도 반복문 처음 배우고 별찍기 예제 처음 풀 때 몇 시간씩 걸려서 이해하려고 했었습니다. 결코 쉬운 예제가 아니므로 시간을 두고 이해하도록 합시다.

13-3 풀이

이 문제는 못풀어도 괜찮습니다. 참고만 하고 넘어가신 후 나중에 다시 도전해 보세요.

for(var i=0; i<5; i++){

  var string = "";

  for(var j=0; j<5; j++){
    if(j<5-i){
      string = string+"*";
    }
    else{
      string = string+" ";
    }
  }

  for(var j=0; j<5; j++){
    if(j>=i){
      string = string+"*";
    }
    else{
      string = string+" ";
    }
  }

  console.log(string);
}

왼쪽 반쪽을 그리는 조건과, 오른쪽 반쪽을 그리는 조건을 따로 나누어서 코딩한 모습입니다.

이걸 합치면 아래와 같이 됩니다.

for(var i=0; i<5; i++){

  var string = "";

  for(var j=0; j<10; j++){
    if(j<5-i || j-5>=i){
      string = string+"*";
    }
    else{
      string = string+" ";
    }
  }

  console.log(string);
}

왼쪽 반쪽(j가 5보다 작은 경우)와 오른쪽 반쪽(j가 5와 같거나 큰 경우)을 합쳤습니다. 오른쪽 반쪽은 j값이 5부터 10까지이므로 조건에 사용되는 j에 5를 빼줍니다.

댓글

J
Jihong Kim 2019.01.27
13-3. if문을 섞어서 풀수도 있었군요.   전혀 생각도 못했습니다... 저는 for문으로 풀었어요. 
for(i=0; i<5; i++){     var star = ""
    for(j=0; j<5-i; j++){       star = star + "*"     }
    for(h=0; h<i; h++){       star = star + "  "     }     for(k=0; k<5-i; k++){       star = star + "*"     }
    console.log(star)   }
I
Ian H 2019.01.28
@Jihong Kim,
정답은 여러가지가 될 수 있습니다. 결과만 제대로 나오면 되요^^
이솜 2019.05.16
잘보고있습니다. 초보자와 실력자의 코딩수준이 차이가 많이 난다는걸 느끼게되네요. 저같은 경우는 콘솔로그를 찍을 때 반복해서 찍도록 유도했는데, 이 경우도 정답에 포함시켜주는건가요..?
for (i = 5; i >= 0; i--) {   var star = "";   var space = "";   for (j = 0; j < i; j++) {     star = star + "*"   }   for (k = 0; k < 5 - i; k++) {     space = space + " "   }   console.log(star + space + space + star) }
너무 꼼수같이 쓴 것 같아서요..ㅋㅋㅋ
I
Ian H 2019.05.16
당연히 정답입니다^^ 나쁜 코드도 아니에요.  제 정답 코드보다 이해하기가 쉽잖아요. 
또 최근에 발견한 건데, 이 문제풀이에 if문을 쓰는게 성능이 더 안좋더라구요.
제 방식으로 10000줄 출력할 때의 속도 측정:  var time = new Date();
for(var i=0; i<10000; i++){
  var string = "";
  for(var j=0; j<20000; j++){     if(j<10000-i || j-10000>=i){       string = string+"*";     }     else{       string = string+" ";     }   }
//  console.log(string); }; 
console.log((new Date())-time);
댓글의 방식으로 10000줄 출력할 때의 속도 측정: var time = new Date();
for (i = 10000 ; i >= 0; i--) {   var star = "";   var space = "";   for (j = 0; j < i; j++) {     star = star + "*"   }   for (k = 0; k < 10000  - i; k++) {     space = space + " "   }   //console.log(star + space + space + star) }
console.log((new Date())-time);
제 정답이 훨씬 느려요^^;;
그리니 제 정답은 그냥 참고용으로만 봐주시길^^;
이솜 2019.05.17
@Ian H,
친절한 답변 감사합니다. 너무나 많은 도움 되고있습니다! 항상 좋은 강의 정말 감사드립니다..!
댓글쓰기

이 글에 댓글을 다시려면 SNS 계정으로 로그인하세요. 자세히 알아보기

UP