다른 사람 풀이

function solution(i, j, k) {
    let a ='';
    for(i;i<=j;i++){
        a += i;
    }

나)

function solution(i, j, k) {
    let a ='';
    for(var i= i; i<=j; i++){
        a += i;
    }

배운점: 매개 변수로 받아온 i를 굳이 다시 새로운 변수에 할당하지 않고,

for 안에서 i로 바로 사용해줄 수 있다!

object를 이용한 문제 풀이

https://school.programmers.co.kr/learn/courses/30/lessons/120896

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제: 문자열 s가 매개변수로 주어집니다. s에서 한 번만 등장하는 문자를 사전 순으로 정렬한 문자열을 return 하도록 solution 함수를 완성해보세요. 한 번만 등장하는 문자가 없을 경우 빈 문자열을 return 합니다.

- s매개변수로 문자열이 들어오고 여기서 한번만 나오는 문자열을

뽑아서 a-z순으로 정렬해서 return 해줘야 한다.

단, 조건의 내용이 없을 시 빈 배열을 return.

 

내가 푼 풀이

function solution(s) {
    let obj= {};
    
    for(let alphabet of [...s]){
        !obj[alphabet] ? obj[alphabet]= 1 : obj[alphabet]++; 
        
    }
    const keysOfObj = Object.keys(obj);

    const key = keysOfObj.filter((key) => obj[key] === 1);
    
    
    return key === null ? [] : key.sort().join("")
}

1) object에 키에는 해당 알파벳을 넣어준다. 그리고 값에는 해당 키와 값이 비어 있을때 1을 할당 해준다.

비어 있지 않다면 기존값에 +1을 더해준다.

2) 해당 key를 배열로 뽑아준다. 해당 키에 해당하는 값이 1 일 때, 즉, 1개밖에 없는 유일한 원소들을 배열로 모아준다.

그 배열이 비어있으면 [] 빈 배열을 리턴해주고 아니면 알파벳을 정렬해서 이어준 문자열을 리턴해준다.

 

 

알게된 점.

객체안에 원하는 조건의 원소를 꺼내고 싶을 때는 일단, 키를 담은 배열을 빼내고,

배열.filter() 안에 값에 해당하는 것을 조건 달아주면 된다.

 

 

 

GCD(Greatest Common Divisor)

대표적인 계산법은 유클리드 호제법이 있다. 
알고리즘 문제를 푸는 데 꼭 알아야 하는 공식인듯 하다.
알고만 있으면 긴 코드를 줄일 수 있다.

 

프로그래머스: 분수의 덧셈 (lv.0)

https://school.programmers.co.kr/learn/courses/30/lessons/120808

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

- 이 문제를 최종적으로 풀기 위해선 이 공식이 필요하다.

-  분모 분자를 모두 구했다고 해도 기약 분수로 나타내려면 약분을 최대한 해야 한다.

- 그러기 위해선 최대 공약수로 나머지가 없이 나누는 방법이 필요하다.

 

공식

// 최대 공약수 구하는 공식
function gcd(a,b) {
	return a % b === 0 ? b : gcd(b, a%b);
}

- 이렇게 몇 줄 안되는 함수이다.

- 재귀 함수를 이용한 공식이다. 

 

-  a % b로 딱 맞아 떨어지면 b 가 최대 공약수가 된다.

그렇지 않으면, 새롭게 좌측에는 이전의 b를 넣고, 우측에는 이전의 a % b의 나머지 값을 넣고

gcd를 한번 더 돌려준다. 그렇게 다시 a % b가 나머지가 없는지 구별해주고 해당 작업을 반복 해준다.

 

최소공배수

 

function lcm(a, b) {
  return (a * b) / gcd(a, b);
}

- 이건 최소공배수(Least Common Multiple, LCM) 구하는 공식이다.

1)

const solution =(my_string, target) => my_string.includes(target) ? 1 : 0

이걸 풀어서 쓰면 const solution =function(my_string, target) {

return my_string.includes(target) ? 1 : 0;

} 직관적이다.

 

2)

return my_string.split(" ");

return my_string.split(""); 는 엄연히 다르다.

let str= 'I like an apple' 

이라면 위에는 ['I','like','an','apple']; 과 같이 단어별 분류되고,

후자는 한글자씩 배열에 저장된다.

 

3)

const [a, b] = [...num_list].reverse();
    return [...num_list, a > b ? (a-b):a*2];

 

다른 분이 푼 풀이를 보면 경이롭다.

끝 자리 수 요소와 그 수의 바로 전 인덱스 요소 차이에 따른 계산이다.

그렇기에 spread 표현법으로 배열을 펼친걸 뒤집어 주고 앞 두자리

즉, 필요한 두 요소를 구조 분해 할당으로 값을 생성하고 삼항연산자로 비교후 배열을 리턴해준다.

for(let i in arr){} // arr가 숫자배열이면 i가 문자열로 변하나

 

const solution = (num_list, n) => num_list.includes(n) ? 1 : 0

이런식으로 쓰면 좋은 점  - > 함수처럼 사용하여 더 안전한 코드, 

직관적이다.

function solution(num_list) {
    
   const result1 = num_list.reduce((accumulator, currentvalue) => {
       return accumulator * currentvalue;    
   }, 1)
   
   const result2 = num_list.reduce((accumulator, currentvalue) => {
       return accumulator + currentvalue;    
   }, 0)
   
   return result1 < result2 ** 2 ? 1 : 0;
}

나는 콜백 함수와 초기값을 지정해주고 그 값들의 누적 계산값을 리턴해주는 .reduce()함수를 사용하였다.

곱을 구하는 구문은 초기값 1을 줬고, 합은 0을 주었다. 계산에 영향을 주지 않는 항등원이다.

 

 

function solution(num_list) {
    let accMul = 1
    let accSum = 0
    for (const num of num_list) {
        accMul *= num
        accSum += num
    }
    return accMul < accSum ** 2 ? 1 : 0
}

다른 분의 코드 풀이이다.

for(변수   of  리스트) {}  형태의 문법을 별로 사용하지 않았었는데 이렇게 사용하니

굉장히 코드가 단축된다는 걸 알았다.

물론 forEach 구문도 있다.

function solution(a, b, flag) {
    let result= flag ? a+b : a-b;
    return result;
}

flag가 참인지 거짓인지에 따라 두 수를 덧셈, 뺄셈 할지를 구하는 간단한 문제이다.

위는 내가 푼 풀이이지만,

다른 사람 풀이를 보니 굳이 변수를 안만들고

 

 return (flag) ? (a+b) : (a-b);

바로 return 해줘도 됐었다.

n과 m의 무작위 정수가 주어지고, number가 두 정수들의 배수인지를 구하는 문제이다.

공배수일 시 1을 반환하고 아니면 0을 반환해준다.

(number % n ===0 ) && (number % m === 0 ) ?  // ...

나는 이런 식으로 구해줬는데

다른 분들의 풀이를 보니 처음 보는 삼항 연산 표현법을 보았다.

 

 

function solution(number, n, m) {
    return (number%n ===0) ? (number%m===0) ? 1 : 0 : 0;
}

잘 모르겠으니

let a =3;
let result= a< 2 ? a<1 ? 1 : 'first' : 'second';
console.log(result);

이런 간단한 코드로 직접 코드를 해석해 보았다.

 

 

(첫번째 조건문) ? (참일시 두번 째 조건문) ? (둘 다 참일 시) : (두번째 조건문 false 일 때) : (첫번째 조건문 false일 때);

라는 결론이 나왔다. 

앞으로 활용될거 같다.

 

+ Recent posts