본문 바로가기
코딩/JS

별 탑 쌓기 문제해결

by 최만규 2022. 8. 7.
728x90

이학준의 공주맛밤

모든 프로그래밍 언어의 반복문 단골 예제 별 탑 쌓기!

순조롭게 진행하던 와중 문제에 봉착했다.

const n = prompt("숫자를 입력하세요.");
for (var p = 1; p < n+1 ; p++) {
  const blank = [];
  const star = [];
  for (var i = p; i < n; i++) {
    blank.push(" ");
  };
  for (var j = 1; j <= 2 * p - 1; j++) {
    star.push("*");
  };
  console.log(blank.join("") + star.join(""));
};

이렇게 겉보기엔 자연스러운 코드를 작성했다. 하지만, 결과를 보면...(실패한 코드입니다 과제 복붙 하실 분들은 밑에 거 퍼가세요)

눈아파

n=5를 입력했을 때의 결과인데 처음 5줄은 의도대로 잘 나오는 것을 볼 수있지만, 그 뒤로 멋대로 쏟아진다.

40분간 끙끙대고 친구한테도 보여줬는데 쉽사리 해결못했다.

구간별 디버깅을 하면서 나름 찾은 문제는 n의 값보다 p값이 커져도 계속 진행되는 되는 것이었다.

추가로, 내부의 for문 중에서 두번째 for문이 계속 실행되었다.

쉽사리, 답을 못찾아서 2번째 줄의 p의 범위를 p <= n으로 전환했더니 정상적으로 작동했다. 하지만 이유 모르는 해결.

옆에 있는 공주 맛밤이 소리를 지르며 문제를 알았다고 소리쳤다. 실제로 문제는 두 번째 줄에 있었는데 한번 보자.

 

문제의 녀석

반복문에서 두번째를 보면 p < n+1에서 내가 생각한 건 n+1보다 p가 작을 때까지 반복해~ 였지만 컴퓨터가 받아들이는건

prompt의 경우 값을 string으로 받아서 3을 입력할경우 '3'+1 즉 '31'이라는 string과 p를 비교하게 되어  30번 출력 반복되었던 것

따라서 해결법은 두가지가 있다 p < n+1 을 p <= n으로 바꿔 p와 n만을 비교하게 하는 첫 번째 방법.

정수 자료형으로 변환해주는 parseInt를 사용해 p < parseInt(n)+1로 하는 두 번째 방법중에 고르면 되겠다. 

 

그러면 왜 내부 반복문 중에서 첫 번째는 정상적으로 중지되고 두 번째만 진행되었을까?

알록달록

첫 번째의 경우 for문 내부에서 생성한 i, 그리고 처음에 내가 입력한 n을 통해 조건문이 만들어졌기에 p값이 계속 증가해도 조건은 성립하지가 않아 실행되지 않았다.

두 번째의 경우 for문 내부에서 생성한 j와 외부 for문에서 생성한 p값이 계속 증가하고 있기에 성립해서 계속 실행되는 것이었다.

https://tnut0305.tistory.com/               학준이 천재

 

Tastynut

 

tnut0305.tistory.com

학준이랑 끄적인 흔적 귀엽다

사실, 앞으로 문제 푸는 건 여기에 올리지 않을 거지만, 그냥 뭔가 같이 끙끙대면서 문제 해결한 게 재밌어서 올린다.

+ 오늘의 회고록

항상 감사합니다~

728x90