알고리즘(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 반환.