2023. 11. 30. 23:55ㆍ카테고리 없음
와 진짜 오늘 공부를 대충해서 쓸게 없다 알고리즘으로 때우기 ㅋㅋㅋㅋ 봐주세용 내일부터 열심히 쓸께요
<행렬의 덧셈>
행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요.
function solution(arr1, arr2) {
var answer = [[]];
for(let i in arr1){
for(let t in arr1[i]){
arr1[i][t] = arr1[i][t]+arr2[i][t]
}
}
return arr1;
}
//별거 있나 배열 안에 배열있는 구조 이다. arr1과 arr2는 같은 동일한 구조이다.ex ) arr1 = [[1,2],[2,3]]
arr1 = [[3,4],[5,6]]
뭐 이런식으로 생겨먹었다. 배열 안에 배열이 있으므로 포문 두번 돌아준다. 첫번째 포인문으 바깥쪽
배열을 돌아주고 두번째 포인문으로 안쪽 배열을 돌아준다. 결과 값 리턴도 결국 arr들과 같은 형태기
때문에 걍 arr1의 같은자리에 합한 값들을 바꿔 줘서 그 자체를 리턴해준다. 끝
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<최대공약수와 최소 공배수>
두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두 수 3, 12의 최대공약수는 3, 최소공배수는 12이므로 solution(3, 12)는 [3, 12]를 반환해야 합니다
function solution(n, m) {
var answer = [];
let small = Math.min(n,m)
let big = Math.max(n,m)
for(let i=1 ; i<=small ; i++){
(small%i===0 && big%i===0) ? answer[0]=i : null
}
answer[1]=n*m/answer[0]
return answer;
}
// 일단 두수중에 큰값을 빅 작은 값을 스몰로 나눠 놓는다. 최대 공약수는 스몰과 빅을 그 공약수로 나눈게
나머지가 없는 것들 중에서 가장 큰 것이므로 일단 두수를 나눴을때 나머지가 없는것이 참이면 그수를 답변의
첫번째 인자로 넣어준다. 공약수 i 는 경국 스몰보다는 작을 꺼니까 스몰까지만 포문 돌려주면 된다.
i 가 최대인것을 찾을때까지 포문은 돌아갈 것이다.
최소공배수는 두 정수를 곱하고 최대공약수 한번 나눠준값하고 같으므로 찾기 쉽당.
두번째 앤써의 인자로 넣어주면 끝
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<3진법 뒤집기>
자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요
주어진수를 3진법 바꾸고 뒤진고 다시 10진법으로 바꾸란다. 하하하
function solution(n) {
var answer = 0;
let arr=[]
for(let i = 1 ; 3**(i-1) <= n ; i++){
arr.push(((n%3**i-n%3**(i-1))/3**(i-1)))
}
console.log(arr)
let arr2 = arr.reverse()
for(let i in arr){
answer += arr[i]*(3**i)
}
return answer;
}
이걸 정규식으로 표현한 사람이 있던데 난 정규식을 모름 흐음... 모르는게 많다.
일단 빈배열을 만들고 빈배열에 3진법으로 만들어질 각자리의 수를 요소로 밀어준다.
주어진수를 3으로 나눴을때의 나머지가 첫자리일테고 3의 제곱으로 나눈나머지에서 3으로 나눈 나머지를 뺀수가
두번째 자리 일테니까 그런식으로 하나씩 밀어준다. 이 문제를 풀당시에 왜 푸쉬 매서드 안에 마지막에 3의 i-1 제곱을
나눠줬는지 기억이 안나넹?? ㅋㅋㅋ 저거 없애고 마지막에 앤써 넣어줄때 3의 i 제곱 안해줘도 될것 같은데 흐음...
암튼 arr2는 그당시에 필요할것 같다고 생각했는데 맨처음 arr을 밀어줄때 낮은 자리수부터 배열 앞에 채워졌기 때문에
결국 앤써는 고대로.... 어라 아닌데??? 마지막에 3진법을 10진법으로 되돌릴려면 arr[i] *(3**i) 이거 해줘야 하는데?
이상하다 그럼 푸쉬매서드 안에 저거 왜 나눠줬었지??? 요상하네 이거 분명 내가 골머리 써가면서 풀었는데
치매인가? 이거 나중에 들여다 봐야겠다.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<이상한 문자 만들기>
문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.
이게 그냥 띄어쓰기 무시하고 홀수는 소문자로 짝수는 대문자로 바꾸는 거면 짱 쉬운데 띄어쓰기를 기준으로 다시 홀수부터 시작함 망할
function solution(s) {
var answer = '';
let arr = s.split(' ')
let newarr= []
for(let i=0 ; i<arr.length ; i++){
let newword = ''
for(let t=0 ; t<arr[i].length ; t++){
newword += t%2===0? arr[i][t].toUpperCase() :arr[i][t] = arr[i][t].toLowerCase()
} arr[i] = newword
}
answer= arr.join(' ')
return answer;
}
s는 "try hello world" 같은 문자열이다. 띄어쓰기가 있을때마다 짜를수 있도록 split 매서들을 써서 각 단어를
arr에 담는다. 이제 arr을 포문을 돌리고 그 안에 단어의 각 자리를 돌리기 위해 포문을 한번더 돌린다. 각각
길이만큼 t번째 가 인덱스가 2로 나눠진 나머지가 뭐냐에 따라 홀수인지 짝수인지 구분되므로 삼항 연사자를 써서 그조건에 맡에 어퍼케이스 해주고 로워 케이스 해줘서 단어의 각자리를 대소문자로 각각 바꿔 재할당 해준다.
이게 중요한게 배열에 요소는 재할당이 되지만 단어의 자리는 재할당이 안되므로 뉴월드라는 새로 바꾼 단어를
배열의 요소로 재할당하는 방식을 사용했다 . 이제 단어들의 배열을 띄어쓰기 포함 조인매서드로 합쳐주면 끝
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<크기가 작은 부분 문자열>
숫자로 이루어진 문자열 t와 p가 주어질 때, t에서 p와 길이가 같은 부분문자열 중에서, 이 부분문자열이 나타내는 수가 p가 나타내는 수보다 작거나 같은 것이 나오는 횟수를 return하는 함수 solution을 완성하세요.
예를 들어, t="3141592"이고 p="271" 인 경우, t의 길이가 3인 부분 문자열은 314, 141, 415, 159, 592입니다. 이 문자열이 나타내는 수 중 271보다 작거나 같은 수는 141, 159 2개 입니다.
function solution(t, p) {
var answer = 0;
for(let i =0 ; i < t.length-p.length+1 ; i++){
let T_arr= t.split('')
let ttt = T_arr.splice(i,p.length).join('')
if(+ttt <= +p ){
answer++
}
}
return answer;
}
t랑 p가 주어지는데 일단 포문을 몇 번 돌지는 p의 길이 값을 같는 t의 부분문자열들의 갯수만큼이니까 t.length-p.length+1 개가 나온다 그러니까 그만큼 포문 돌리면 된다.
t를 쪼갠 배열을 만들어 본다. 그 배열에서 스플라이스 매서드를 통해 i번 인덱스의 요소부터 p의 길이만큼을 끄집어내서
조인 매서드로 합친다. 그게 ttt r가 된다.ttt가 주어진 p보다 작은 경우에 앤써의 카운트를 하나씩 올려준다.
그 포문이 다돌면 그 카운트가 p보다 작은 t의 부분 문자열의 합이 된다.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~