코드노트

javascript 반복문 문제 풀이 정리 본문

Code note/자바스크립트 알고리즘 문제풀이

javascript 반복문 문제 풀이 정리

코드노트 2022. 8. 3. 23:00

javascript는 알고리즘 공부를 처음 시작할때 레퍼런스나 예시문제들이 많이 없어서 어려웠다.

풀이나 예제문제들을 찾기도 힘들었는데

이번 제로베이스 프론트엔드 과정에서 연습문제를 보면서 공부를 하니깐 어느정도 감은 잡히는거 같다.

 

알고리즘 공부를 어떻게 시작해야할지 갑갑했는데

그냥 무작정 반복학습으로 이러한 문제 유형들은 이렇게 풀어야하는구나! 라고 생각하면서 공식들을 외워가고있다.

이게 맞게 하고 있는지는 모르겠지만... 문과였던 나는..지금으로선 이방법뿐이다..

생각하는 루트가 처음에는 한가지 두가지였다면 이제는 세가지 네가지 들이 생각나는거 같다!

 

 

1. 자연수를 입력 받은 만큼 문자열을 반환하는 함수.

 

자연수를 입력을 받아서 문자열로 반환하는 함수는 어렵지 않다.

for문을 통해서 자연수만큼 반복문을 통해서 문자열을 찍어주기만 하면 된다.

어렵게 생각할필요가 없었다.

for(let i = 0; i < 자연수; i++) {
	변수 += "문자"
}

return 변수에 반복한 만큼 문자열을 += 더하게 해주면 자연수만큼 문자열이 출력된다.


2. 두 자연수 사이의 숫자들을 출력하는 함수.

 

두 자연수를 입력 받아서 두 자연수 사이의 숫자들을 출력해야하는 문제이다.

예를 들어 2, 5를 생각하게 되면 2, 3, 4, 5 를 출력하면된다.

배열 변수에 넣어주면 되기 때문에 push를 통해서 넣어주기만 하면 된다고 생각했는데

입력되는 수가 만약 5, 2 면 조건문을 넣어줘야한다.

function answer(x, y) {
  let res = [];
  for(let i = x; i <= y; i++) {
    res.push(i)
  }
}

- for문에 파라미터를 넣을때 x, y값을 활용해서 반복문을 실행한다.

- 두 자연수 사이의 값을 출력해야하기 때문에 i = x로, 최대 반복하는 파라미터는 y로 넣어주게되면 두 자연수 사이 만큼 반복문을 돌릴 수 있었다.

if (x > y) {
  let a = x;
  x = y;
  y = a;
}


if (x > y) {
  [x,y] = [y,x]
}

- 조건문을 통해서 x가 y보다 큰 경우 x와 y자리를 바꿔서 실행하게 되면 입력수가 앞자리가 크더라도 정상적으로 출력된다.


3. 반 평균 문제 구하기

배열 형태로 들어온 점수들을 해당 반의 평균 점수를 반환시킨다.

단. 평균 점수가 소수점으로 나올 수 있기 때문에 두번째 자리까지 반올림하여서 반환시켜야한다.

 

처음 이문제를 풀때 정말 쉽게 생각했다. 배열에 있는 수를 더하고 length값 만큼 나눠주기만 하면 될 줄 알았는데...

함수는 문제를 푸는 방식을 생각을 하더라도 코딩으로 출력값이 정확하게 나올때까지 정확하게 푼게 아니였다..

그래서 문제를 풀때 내가 만들어야하는 코드들을 풀어야하는 순서대로 나열해보는것도 좋은 방법이였다.

 

1. 반 점수를 모두 더한다.

  for (let i = 0; i < score.length; i++) {
    average += score[i];
  }

- average에 배열의 length만큼 반복문을 돌리고 arr.[ i ]를 통해서 점수를 하나씩 더하게 한다.

 

2. 모두 더한 점수를 평균 점수로 나눈다.

average = average / score.length;

 

3. 소수점 두번째자리까지 나타내어 출력한다.

average = average.toFixed(2);

이렇게 3가지 단계별로 나누어서 하게 되면 그거에 맞는 코드들을 작성하고 순서대로 코드를 실행할 수  있었다.


4. 배열 중의 가장 큰수의 인덱스값을 출력

문제를 풀고나면 쉽지만 풀기전까지의 과정이 이해가 되지 않았다.

for반복문을 통해서 배열의 수만큼 반복하여 변수를 하나 만들어서 최대값을 넣어준다.

- 최대값을 저장하는 변수를 하나 만든다. 값은 0.

- 반복문을 배열의 개수만큼 돌린다.

- if문을 통해서 최대값 < 요소 일때 최대값에 저장한다.

- 마지막 결과값에 i + 1로 인덱스를 첫번째 번호로 반환하게 해준다.

  let max = 0
  
  for (let i = 0; i < 배열.length; i++) {
    if (max < 배열[i]) {
      max = 배열[i];
      employee_id = i + 1;
    }
  }

5. 무한 뺄셈

반복문 예제중에서 가장 이해하기 어려웠던 문제이다...

무한뺄셈인데 for문이 아닌 while문을 통해서 호출해야했다.

입력값 자연수 두개를 통해서 무한뺄셈을 해야한다.

 

문제를 계속 읽어보니 문제 설명에서 문제를 어떻게 해결해야할지 단어들을 뽑아낼수 있었다.

- 반복 연산 = while

- 무한 연산을 막기 위해서 뺀 값이 음수일때 프로그램 종료 = break

- 초기 입력된 수, 뺄셈을 통해 나온 모두를 배열에 저장 = 빼기를 한 변수 push

 

let sum;

while(true) {
  sum = s - e;
  s = e  // s자리에 e값을 넘겨주고
  e = sum // e자리에 sum값을 넘겨주면서 무한 뺄셈을 진행한다.
  
  if(e < 0) break; // e 값이 -음수가 되면 반복문을 멈춘다.
  
  sequence.push(sum)
}

 

ex) 15, 8
15 | 8 | 7 | 1 | 6 |
s  | e |sum|   |   |
   | s | e |sum|   |
   |   | s | e |sum|

두 자연수를 s 자리에 e값을 넘겨주고, e 자리에 sum 값을 넘겨주면서 무한 뺄셈이 진행되도록 해준다.

 

이부분이 가장 이해가 안되던 부분이다. 왜 s값에 e를 넣는거지? 라는 생각이 들었다.

e 자리에 s 값을 넣어야하는게 아닌가? 라는 생각을 했는데 내가 잘못생각했었다.

e 자리에 s 값을 넣게 되면 음수가 될수없다. 15 - 8이 무한반복 될뿐...

 

 


이제 조금 반복문에 대해서 이해가 되기 시작하는거같다..

html, css 도 아직 공부할게 많지만 알고리즘 먼저 어느정도의 지식이 쌓이면 좋겠다.

이번주는 알고리즘 문제만 다 풀어보고 백준문제도 몇개 풀어보도록 해야겠다.