알고리즘(with TS)

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

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 반환.

'알고리즘(with TS)' 카테고리의 다른 글

알고리즘 풀이 4)1-3 (완전탐색-블루투포스)  (0) 2023.01.23
알고리즘 풀이 3)4-5  (0) 2023.01.23
알고리즘 풀이 2)1-5  (1) 2023.01.17
알고리즘 풀이 1)15-17번  (0) 2023.01.14
알고리즘 풀이 1)11-14번  (0) 2023.01.14