TIL: 2022-05-13 알고리즘 day1

김하연·2022년 5월 14일
0

TIL: Today I Leaned

목록 보기
4/27

1.직사각형 별찍기

이 문제에는 표준 입력으로 두 개의 정수 n과 m이 주어집니다.
별(*) 문자를 이용해 가로의 길이가 n, 세로의 길이가 m인 직사각형 형태를 출력해보세요.

예시

입력

5 3

출력

*****
*****
*****

내가 작성한 solution.js

process.stdin.setEncoding('utf8');
process.stdin.on('data', data => {
    const n = data.split(" ");
    const a = Number(n[0]), b = Number(n[1]);
    const row = '*'.repeat(a);
    for(let i = 0; i<b; i++){
        console.log(row);
    }
});

항해 강의 들으면서 영화 별점 페이지 만드는 내용이 있었는데, 그 때 repeat을 배우고 진짜 유용하겠다고 생각했었는데, 여기서 써먹었다!!!
근데 하나만 알고 둘은 모름.. 별을 repeat한 row를 또 repeat해서 끝내면 더 간단한거였는데, 밑에서 굳이 또 for문을 돌려버렸죠..?

const row = ('*'.repeat(a) + '\n').repeat(b);

이렇게 수정하면 좀 더 간결해진다.




2.짝수와 홀수

정수 num이 짝수일 경우 "Even"을 반환하고 홀수인 경우 "Odd"를 반환하는 함수, solution을 완성해주세요.

예시

입출력 예

num	return
3	"Odd"
4	"Even"

내가 작성한 solution.js

function solution(num) {
    var answer = '';
    if(num % 2 === 0){
        answer = 'Even';
    }else{
        answer = 'Odd';
    }
    return answer;
}

나머지가 0일 경우와 아닌 경우로 나눠서 풀어봤다.
근데 이걸 또 다시 생각해보니 아래처럼 삼항연산자를 쓰면 더 짧게 쓰는것도 가능하다.

function solution(num) {
    var answer = '';
    return answer = num % 2 === 0 ? 'Even' : 'Odd'
}



3.가운데 글자 가져오기

단어 s의 가운데 글자를 반환하는 함수, solution을 만들어 보세요. 단어의 길이가 짝수라면 가운데 두글자를 반환하면 됩니다.

예시

입출력 예

s			return
"abcde"		"c"
"qwer"		"we"

내가 작성한 solution.js

function solution(s) {
    var answer = '';
    let from, to = '';
    if(s.length%2 === 0){ //짝수일경우
        from = s.length/2 - 1;
        to = s.length/2 + 1;
        answer = s.slice(from,to);
    }else{
        from = Math.floor(s.length/2);
        to = Math.ceil(s.length/2);
        answer = s.slice(from,to);
    }
    return answer;
}

문자를 slice할 기준을 잡기 위해 짝수일 경우와 홀수일 경우에 따라 from, to를 먼저 정의했다.



4.내적

길이가 같은 두 1차원 정수 배열 a, b가 매개변수로 주어집니다. a와 b의 내적을 return 하도록 solution 함수를 완성해주세요.

이때, a와 b의 내적은 a[0]*b[0] + a[1]*b[1] + ... + a[n-1]*b[n-1] 입니다. (n은 a, b의 길이)

예시

입출력 예

a			  b				  result
[1,2,3,4]	  [-3,-1,0,2]	  3
[-1,0,1]	  [1,0,-1]		  -2

입출력 예 #1
a와 b의 내적은 1*(-3) + 2*(-1) + 3*0 + 4*2 = 3 입니다.
입출력 예 #2
a와 b의 내적은 (-1)*1 + 0*0 + 1*(-1) = -2 입니다.

내가 작성한 solution.js

function solution(a, b) {
    var answer = 1234567890;
    return answer = a.reduce((acc,cur,idx) => acc = acc + cur*b[idx], 0);
}

이 문제는.. 문제를 이해는 것 부터가 문제였다..ㅋㅋㅋㅋㅋ 내적?? 내적이 대체 뭐야...???
나의 내적 갈등을 일으킨 문제...^^
수포자인 나한테는 자연수, 정수, 유리수, 실수 이해는것조차 힘든데.. 아무튼 내적이 뭔지 몰라서 당황좀 했는데 입출력 예시에 대충 공식이 나와있어서 참고해서 풀었다.
어제 팀원분들이랑 같이 문제 해설 하면서 reduce 함수의 강력한 힘을 실감하고 오늘 응용해보고 싶었다. 나름 화살표 함수까지 사용해서 최대한 간결하게!
reduce함수 관련 링크는 어제 팀원분께서 reduce 학습을 추천하며 보내주신건데, 아래 표현이 너무 재밌었다 ㅋㅋㅋㅋ

이와 같이 sort, every, some, find, findIndex, includes도 다 reduce로 구현 가능합니다. reduce가 이들 모두의 아버지였던 것입니다. ㅠㅠ

0개의 댓글