알고리즘(with TS)

알고리즘 풀이 2)1-5

2023. 1. 17. 12:31

2_1. 큰수 출력하기

function solution2_1(arr: number[]): string {
  let answer = [arr[0]];
  for (let i = 1; i < arr.length; i++) {
    if (arr[i - 1] < arr[i]) answer.push(arr[i]);
  }
  return answer.join(" ");
}
console.log(solution2_1([7, 3, 9, 5, 6, 12]));
 0번 째 경우를 따로 명시해주기 번거로워서 answer의 초기값에 처음부터 넣어주었다.
+ filter를 쓰는 방법도 있음
 
 
2_2. 보이는 학생
 
//이렇게 하면 틀림!
function solution2_2(arr: number[]): number {
  let answer = 0;
  for (let i = 1; i < arr.length; i++) {
    if (arr[i - 1] < arr[i]) answer++;
  }
  return answer;
}
console.log(solution2_2([130, 135, 148, 140, 145, 150, 150, 153]));

//-------강의 풀이------
function solution2_2_1(arr: number[]): number {
  let answer = 1;
  let max = arr[0]
  for (let i = 1; i < arr.length; i++) {
    if (arr[i]>max) {
      answer++;
      max = arr[i];
    }
  }
  return answer;
}
console.log(solution2_2_1([130, 135, 148, 140, 145, 150, 150, 153]));
바로 앞의 숫자와만 비교하는 것이 아니라 지금까지의 숫자들과 비교했어야 함!
답이 맞았던 이유 : i=0일때 answer이 2가 되었어야 하는데 이에 대해 생각하지 않았다.
 
 
2_3.가위바위보
 
function solution2_3(arr1: number[], arr2: number[]): string {
  let answer: string[] = [];
  for (let i = 0; i < arr1.length; i++) {
    let check = arr1[i] - arr2[i];
    if (check === 0) answer.push("D");
    else if (check === 2) answer.push("B");
    else if (check === -2) answer.push("A");
    else if (check > 0) answer.push("A");
    else answer.push("B");
  }
  return answer.join("\n");
}
console.log(solution2_3([2, 3, 3, 1, 3], [1, 1, 2, 2, 3]));

보를 냈을 때의경우가 헷갈렸다.

 

 

2_4. 점수계산

function solution2_4(arr: number[]): number {
  // let answer:number[]=[];
  // for(let i=0; i<arr.length; i++){
  //   if(i===0) answer.push(arr[0]);
  //   if(arr[i]===1){
  //     answer.push(answer[i-1]+1);
  //   } else answer.push(0);
  // }
  // return answer; -> 이렇게 하면 NaN가 나온다..?

  let answer = [arr[0]];
  for (let i = 1; i < arr.length; i++) {
    if (arr[i] === 1) {
      answer.push(answer[i - 1] + 1);
    } else answer.push(0);
  }
  return answer.reduce((acc, cur) => acc + cur, 0);
}
console.log(solution2_4([1, 0, 1, 1, 1, 0, 0, 1, 1, 0]));

처음에 짠 코드에서 답이 이상하게 나오는 이유를 찾지 못해서 애먹은 문제.

결국 answer을 arr[0]값이 들어있는 상태로 초기화 해줘서 첫번째 if문을 없애는 방법으로 풀었는데

나중에 보니 원인은 for문 안에서 첫번째 if처리 후, 두번째 if 처리가 진행 되기 때문이였다.

(배열[-1]은 undifined가 반환되고, undefined+1 은 NaN! )

두 if문을 if else로 연결하거나, 첫번째 if문 종료 후, i++ 를 추가해주면 해결!

 

2_5. 등수구하기
 
function solution2_5(arr: number[]): string {
  let len = arr.length;
  let answer = Array.from({ length: len }, () => 1);
  for (let i = 0; i < len; i++) {
    for (let j = 0; j < len; j++) {
      if (arr[i] < arr[j]) answer[i]++;
    }
  }
  return answer.join(" ");
}
console.log(solution2_5([87, 89, 92, 100, 76]));

const arr = new Array(5); // 5짜리 길이를 가진 빈배열 생성.

const arr = Array.from( {length: 5}, () => 0 ); // 5짜리 길이가 0으로 채워진 배열 생성.

 

작은 값으로 변수 Max를 정해놓고 비교하는 값에 따라서 Max를 바꿔주는 다른 풀이랑 비슷한 방법인것 같다.

[1,1,1,1,1] 로 초기화된 배열을 하나씩 변화시키기.