알고리즘(with TS)

알고리즘 풀이 2)6-7, 3)1-3 & TS(isNaN 사용시 주의할 부분)

S_sunny 2023. 1. 19. 00:15

Section2_6번: 격자판 최대합

function solution2_6(num: number, arr: number[][]): number {
  const rowSums: number[] = [];
  const columnSums: number[] = [];
  let diaSumFromLeft = 0;
  let diaSumFromRight = 0;
  
  // arr[0][0]+arr[0][1]
  for (let i = 0; i < num; i++) {
    let lineSum = 0;
    for (let j = 0; j < num; j++) {
      lineSum += arr[i][j];
    }
    rowSums.push(lineSum);
  }

  // arr[0][0]+arr[1][0]
  for (let i = 0; i < num; i++) {
    let lineSum = 0;
    for (let j = 0; j < num; j++) {
      lineSum += arr[j][i];
    }
    columnSums.push(lineSum);
  }

  // arr[0][0]+arr[1][1]
  for (let i = 0; i < num; i++) {
    diaSumFromLeft += arr[i][i];
  }

  // arr[0][4]+arr[1][3]
  for (let i = 0; i < num; i++) {
    diaSumFromRight += arr[i][num - 1 - i];
  }
  return Math.max(...rowSums, ...columnSums, diaSumFromLeft, diaSumFromRight);
}
console.log(solution2_6(5, [
    [10, 13, 10, 12, 15],
    [12, 39, 30, 23, 11],
    [11, 25, 50, 53, 15],
    [19, 27, 29, 37, 27],
    [19, 13, 30, 13, 19],
  ])
);
  • 대각선이 두개라는 사실을 잊고 답이 왜 안나오나 했다..
  • 이차원 배열에 for문 돌릴때 조건 적용하는부분에 머리가 잘 안돌아간다… 한참걸렸음ㅠㅠ

------------------------강의를 듣고 이중for문 한번만 돌리면서 4개 값 구하는 방법을 적용해봤다.----------------------

  • 대각선은 한줄만 구하면 되니까 첫번 째 for문 돌 때 차례로 더해놓고 행, 렬은 여러개니까 두번 째 for문 돌 때 구해서 한 줄마다 배열에 넣어두었다.
function solution2_6_1(num: number, arr: number[][]): number {
  const rowSums: number[] = [];
  const columnSums: number[] = [];
  let diaSumFromLeft = 0;
  let diaSumFromRight = 0;

  for (let i = 0; i < num; i++) {
    // arr[0][0]+arr[1][1]
    diaSumFromLeft += arr[i][i];

    // arr[0][4]+arr[1][3]
    diaSumFromRight += arr[i][num - 1 - i];

    let rowNumSum = 0;
    let colNumSum = 0;
    for (let j = 0; j < num; j++) {
      // arr[0][0]+arr[0][1]
      rowNumSum += arr[i][j];

      // arr[0][0]+arr[1][0]
      colNumSum += arr[j][i];
    }
    rowSums.push(rowNumSum);
    columnSums.push(colNumSum);
  }

  return Math.max(...rowSums, ...columnSums, diaSumFromLeft, diaSumFromRight);
}
console.log(solution2_6_1(5, [
    [10, 13, 10, 12, 15],
    [12, 39, 30, 23, 11],
    [11, 25, 50, 53, 15],
    [19, 27, 29, 37, 27],
    [19, 13, 30, 13, 19],
  ])
);

 

Section2_7번: 봉우리

function solution2_7(num: number, arr: number[][]): number {
  let count = 0;
  arr.unshift(Array.from({ length: num }, () => 0));
  arr.push(Array.from({ length: num }, () => 0));
  for (let i = 0; i < arr.length; i++) {
    arr[i].unshift(0);
    arr[i].push(0);
  }
  for (let i = 1; i <= num; i++) {
    for (let j = 1; j <= num; j++) {
      if (arr[i][j] > arr[i - 1][j] 
      && arr[i][j] > arr[i][j - 1] 
      && arr[i][j] > arr[i][j + 1] 
      && arr[i][j] > arr[i + 1][j]) count++;
    }
  }
  return count;
}
console.log(solution2_7(5, [
    [5, 3, 7, 2, 3],
    [3, 7, 1, 6, 1],
    [7, 2, 5, 3, 4],
    [4, 3, 6, 4, 1],
    [8, 7, 3, 5, 2],
  ])
);

첫번째 for문으로 빨간색 추가해주고, 두번째 for문으로 파란색 추가해주기.

배열에 unshift()와 push()를 동시에 적용 할 수 있을 줄 알았지만 불가능했다. 

 

 

 상하 좌우값 체크하는게 헷갈릴땐 직접 그려보기

 

 

  • 크기 비교를 한번에 하는 방법은 없나보다ㅠ a < (b, c, d) 안됨 /  a<(b && c && d) 안됨

--------------------------------강의풀이----------------------------------

이렇게 방향 탐색하는 문제유형이 종종 나온다고 한다.

아직 완전히 이해하진 못했지만 계속 보다보면 언젠간 내것이 되겠지...?ㅜ0ㅜ

function solution(arr){  
  let answer=0;
  let n=arr.length;
  let dx=[-1, 0, 1, 0];
  let dy=[0, 1, 0, -1];
  for(let i=0; i<n; i++){
    for(let j=0; j<n; j++){
      let flag=1;
	  //상,하,좌,우 4방향 확인
      for(let k=0; k<4; k++){
        let nx=i+dx[k]; //확인하려는 행좌표
        let ny=j+dy[k]; // 확인하려는 열좌표
        if(nx>=0 && nx<n && ny>=0 && ny<n && arr[nx][ny]>=arr[i][j]){
          flag=0; //봉우리가 아니면 0
          break; //봉우리 아니라는 결과가 나오면 나머지방향 확인할 필요X
          }
        }
        if(flag) answer++; //0->false, 1->true이
        }
    }  
    return answer;
}
console.log(solution(5, [
    [5, 3, 7, 2, 3],
    [3, 7, 1, 6, 1],
    [7, 2, 5, 3, 4],
    [4, 3, 6, 4, 1],
    [8, 7, 3, 5, 2],
  ])
);

 

Section3_1번: 회문 문자열

function solution3_1(str: string): string {
  return str.toUpperCase() === str.toUpperCase().split("").reverse().join("") ?  "YES" : "NO"
}
console.log(solution3_1('gooG'));

 

Section3_2번: 유효한 팰린드롬

function solution3_2(str: string): string {
  const UpperStr = str.toUpperCase();
  let checkStr = "";
  for (let char of UpperStr) {
    if (char.charCodeAt(0) >= 65 && char.charCodeAt(0) <= 90) checkStr += char;
  }
  return checkStr === checkStr.split("").reverse().join("") ? "YES" : "NO";
}
console.log(solution3_2("found7,  time:  study;  Yduts;  emit,  7Dnuof"));

  • 아스키코드 변환메소드 : .charCodeAt(0) —>0을 써줘야한다.필수!(변환하려는 문자열의 인덱스)
    • 대문자는 65~90 | 소문자는 97~122

 

 

Section3_3번: 숫자만 추출

function solution3_3(str: string): number {
  let answer = "";
  for (let char of str) {
    if (!isNaN(Number(char))) answer += char;
  }
  return Number(answer);
}
console.log(solution3_3("g0en2T0s8eSof"));

  • 타입스크립트로 isNaN()를 쓸때 인자로 number 외에는 넣을 수 없다. 넘버인지 체크하고 싶어서 쓰는 메소드인데ㅎ… → 그럼 Number() 로 변환해서 넣어주면 가능하다.

 

 

  • 숫자가 아닌 인수가 Number()에 들어가면 NaN 반환.
  • NaN는 타입이 number이므로 Number()에 들어갈 수 있다.
  • Number(NaN) // → NaN 반환.