메가바이트 6주차 (1/16) Coding Test, 불변성과 가변성, 3차 과제 설명

정영찬·2023년 1월 16일
0
post-thumbnail

TIL

코딩 테스트

프로그래머스 코딩테스트 lv.0 18일차 문제풀이 완료

  • 겹치는 선분의 길이
  • 유한소수 판별하기
  • 저주의 숫자 3
  • 평행

유한소수 판별하기

function solution(a,b) {
    // 입력한 값의 조합을 기약분수로 만들기
    
    for (let i = 2; i < b; i++){
      if (a === 1 || b === 1){
        break;
      }
      if (a % i === 0 && b % i === 0){
        a = a/i
        b = b/i
      }
    }
   // 기약분수인 상태에서 분모의 인수 확인
  
    var what = []; // 빈배열 
    let index = 2
    while (b > 1){
        if ( b % index === 0) {
            b = Math.floor(b / index)
            what.push(index)
            index = 2;
        } 
      else{
        index++
      }
        
    }
  return (what.filter((e) => e !== 2 && e !== 5).length > 0 ? 2 : 1)
 
}


  • 입력한 수 (a,b)로 만들어진 변수를 기약변수로 만든다 for문을 사용해서 분자나 분모가 1이 될때까지 반복 진행한다.

  • 기약분수가 만들어졌으면 분모의 인수가 2나 5가 존재하는지 파악하기 위해서 분모를 소인수분해했다. while문을 사용해서 2부터 나누면서 나눠질 때마다 what이라는 배열에 추가하여 b가 1보다 클동안 계속 진행한다.

  • 여기서 else를 사용하지 않고 index++만 사용했더니 시간 초과로 문제가 틀렸다고 나왔다. 아무래도 작은 구문이라도 else를 씌워줘야하나보다.

  • 마짐가으로 what 배열을 filter 메서드를 사용해서 2나 5가 아닌 요소만 추가했고, 해당 과정을 거친 배열의 길이가 0보다 클경우에는 2나 5 가 아닌 다른 수를 인수로 가지고 있다는 뜻이 되기 때문에 2를 리턴하고 아니라면 1을 리턴한다.

다른 사람이 풀었던 내용중에서 유클리드 호제법으로 최대 공약수를 구해서 기약분수를 구하는 과정으로 문제를 풀었는데, 유클리드 호제법은 두수를 나눈 나머지가 존재한다면 다시 피연산자를 그 나머지로 나누는 과정을 반복해서 처음으로 나누어 떨어지는 순간 최대공약수가 되는 원리이다.

이를 이용해서 재귀 함수를 사용해서 최대공약수를 2줄로 줄였다.
그이후의 나머지 과정은 비슷한다. 이런 방식으로 최대공약수를 구하는 과정이 매우 인상적이었다.

수학은 역시 뗄려고 해도 뗄수가 없는 듯 하다 ㅜㅜ....

다른 풀이


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

  let denom = b / gcd(a, b); // 분모  2
   // 기약분수인 상태에서 분모의 인수 확인
  
    var what = []; // 빈배열 
    let index = 2
    while (denom >= 2){
        if ( denom % index === 0) {
            denom = Math.floor(denom / index)
            what.push(index)
        } else{
            index++
        }
        
    }
 
return what.filter((e) => e !== 2 && e !== 5).length > 0 ? 2 : 1
}

JavsScript

3차 과제 설명

강사님이 직접 제작하신 api를 사용해서 TODO 리스트 사이트를 제작한다.

  • api를 사용하는 방법을 가르쳐 주셨음.

  • 기본적인 기능 구현은 쉽지만, 고도화 작업을 하는 것이 문제일 것이라고 강조하심

  • 생성 버튼을 클릭했을때, 버튼 안에 로딩애니메이션을 구현해서 사용자에게 생성중이라는 사실을 시각화하는 작업이 있었으면 좋겠다고 하심

  • 저번시간에 배운 모듈화를 사용해서 코드를 컴팩트하게 구현해볼 것

  • api key와 유저 아이디를 숨기는 작업도 해볼 것

4차 과제 전에 연습을 빡세게 시키려는 의도인것 같아서 조금 떨린다...

불변성과 가변성

메모리에 할당되는 데이터중 원시형 데이터는 메모리에 똑같은 데이터가 생성되지 않는다.


let a = { x: 1 }
let b = a

만약 이런 형태로 변수가 선언되었다면 메모리에는 아래와 같이 구성되게 된다.
메모리 하나에는 하나의 데이터가 들어야가 하므로 1은 M2로 저장되고, a는 M1에서 x가 1이 저장되어있는 M2를 바라보게 되는 것이다.
b에다가 a를 대입했기 때문에 b는 M1을 바라보게 된다.

M1M2M3M4
{x : m2}1

그럼 만약에

b.x = 7

이렇게 값을 변경한다면 어떻게 될까? M2에 눌러앉아있는 1이 사라질까?

M1M2M3M4
{x : m3}17

이렇게 새로운 메모리 장소에 7이 들어가게된다..
그럼 만약에 아래처럼 a와 b를 콘솔로 보게되면 어떻게 될까?

console.log(a) // x:7
console.log(b) // x:7

두개가 같은 값이 되어버린다.

aM1을 바라보고 있었다. 그런데 bx값을 변경하게 되면서 M1에 있었는 xM3를 바라보게 되었기 때문에 a 의 값을 출력해도 x가 바라보는 메모리의 주소가 바뀐상태이기 때문에 똑같이 7이 나오게 된다.

따라서 불변성은 "원시 데이터가 저장된 메모리 주소는 변동되지 않는다" 는 뜻이고, 객체데이터의 값은 요소가 바라보는 메모리 주소에 따라 값이 변동되는 것이 바로 가변성이다.

만약 원본 객체 데이터가 변동되는것을 원하지 않는다면 얕은 복사를 해주면 된다.

{...객체}
const a = {x:[1,2]}
let b = {...a}


b.x = 7

console.log(a) // {x : [1,2]}
console.log(b) // {x : 7}
M1M2M3M4
{x : m2}[m3,m4]12
M4M5M7M8
new {x: m2}7

얕은 복사로 객체를 복사하면 위의 표처럼 다른 메모리 장소에 새로운 객체 데이터가 저장된다.
그럼 만약에 b 데이터의 배열요소 값을 변동하면어떻게 될까?

const a = {x:[1,2]}
let b = {...a}


b.x[1] = 7

console.log(a) // {x : [1,7]}
console.log(b) // {x : [1,7]}

값이 같아진다. 얕은 복사는 참조데이터 내부의 참조 데이터는 복사되지 않은것이다. 이에 대한 대처를 하기 위한 방법으로 깊은 복사가 존재한다.
_.cloneDeep(value)

const a = {x:[1,2]}
let b = _.cloneDeep(a)


b.x[1] = 7

console.log(a) // {x : [1,2]}
console.log(b) // {x : [1,7]}
profile
개발자 꿈나무

0개의 댓글