728x90

기본 알고리즘부터 풀어보는데에 있어서

이 소수를 구하는것에 상당히 애를 먹는다.

물론 소수 뿐만이 아니라 다른 유형의 문제들도

결국 머릿속에선 정리가 매우 잘되지만, 이걸 코드로 구현하는게 쉽지가 않다.

아무튼 각설하고, 소수를 판별하는 알고리즘에 대해 알아보도록 하자.

소수

소수는, 1보다는 큰 자연수들 중 1과 자기 자신만을 약수로 가지고 있는 수를 의미한다.

위키피디아의 이미지를 가져와보았다.

에라토스테네스의-체

순서는 2부터 소수를 구하고자 하는 목표값 까지의 모든 수를 나열한다.

그다음 2는 소수기에 Prime Numbers에 2를 넣어준다.

그 다음 자기 자신을 제외한 2의 배수를 다 지운다.

지우는 이유?

자기 인수의 배수를 다 지우는 이유는 그 수들은 이미 배수라서 약수에 인수가 포함되기 때문이다.

이 구간을 계속 반복해주면 목표 수 사이까지의 소수가 구해지게 된다.

말로는 설명하기 어려운것 같다.

코드로 자세히 봐보도록 하자.

자바 코드로 구현하기

public class EratosTenes {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        //여기서 N의 값을 9라고 해보자.
        int N = Integer.parseInt(br.readLine());

        boolean[] array = new boolean[N + 1]; // 배열은 0부터 시작하기 때문에 자릿수를 맞춰주는 개념으로 1을 더해주었다.

        //0과 1은 소수가 아니다.
        array[0] = true;
        array[1] = true;

        //2부터 시작해서 배열 총길이의 제곱근 값까지 반복한다.
        for(int i = 2; i <= Math.sqrt(array.length); i++) {
            if (array[i]) {
                continue;
            }

            // 소수가 아닌수를 true
            for(int j = i * i; j < array.length; j += i) {
                array[j] = true;
            }
        }

    }
}

이렇게하여 boolean[] array의 배열값에서 true이면 전부 소수가 아닌수가 된다.

여기서 true로 바꾸어주는 로직이 i * i로 시작하는 이유는

i의 처음 인수가 2이다. 근데 소수에서는 0과 1을 제외하면 2, 3까지는 무조건 소수임이 보장되어 있다.

그래서 i * i로 4부터 시작하여 자기 자신만큼을 더해주는게 배수의 원리이니까 전부 true로 바꿔주는게 된다.

이렇게 하여 소수를 구할 수 있게 된다.

728x90

'CS > 알고리즘' 카테고리의 다른 글

Select Sort 선택정렬  (0) 2022.08.10
728x90

웹 캐시

웹 캐시 또는 HTTP 캐시 라고 하는데,

이 캐시는 서버와 불필요한 네트워크 통신을 줄이기 위해서 임시 저장한

정보들을 바로 뿌려주는 기술이다.

웹 캐시가 자신의 저장소 내에 요청된 리소스를 가지고 있다면, 그 요청을 가로채

원래라면 서버에서 리소스를 가져오겠지만, 리소스의 복사본(프록시) 를 통해 데이터를 가져오게 된다.

성능이 향상되는건 말할 것도 없지만, 이 리소스가 영원히 변하지 않는 것은 아니기 때문에

가지고 있던 값이 변하기 전까지만 캐시로 유지하고 더 이상은 캐싱을 하지 않아야 한다.

사설 브라우저 캐시

이 캐시는 한 사용자 전용의 캐시이다.

예로, 크롬 브라우저를 켰을때 브라우저 자체는 이 사용자만의 캐시를 고유하게 갖고 있다.

이게 사용자마다의 개개인의 캐시로 기록이 되어있기 때문에 사설 브라우저 캐시라고 하는 것이다.

공유 프록시 캐시

내가 이해한 바로는 어떤 API를 호출하는 작업이 있을 때

자기 자신뿐 아니라, 같은 API를 누구든 호출할 때 재사용되기 때문에 그 재사용되는 응답을 저장하는 캐시이다.

유효성

사실상 캐시에 저장된다고 한다면 그 리소스가 변경, 만료기간이 없다고 할 때,

영원히 캐시로만 서비스가 될 수도 있다.

그렇지만 캐시의 공간은 유효하기 때문에 주기적으로 제거가 된다.

동작과정

스크린샷 2021-12-10 오전 10 17 43

Cache-Control 헤더의 max-age값은 만료 시간을 의미한다.

1번 그림

1번그림은 캐시가 없을 때, /doc의 url로 GET 요청을 하면

캐시가 없는 상태이므로, 서버에서 리소스를 조회한다.

그 이후에 저장된 캐시가 없었기 때문에, 이 리소스를 바탕으로 캐시를 하나 생성하고

클라이언트에 Response값을 내려준다.

2번 그림

1번 그림에서 10초가 지난뒤에 다시 /docGET요청을 보내본다.

근데 설정한 만료시간은 100초 이므로 10초는 만료시간 내에 존재한다.

그래서 서버로 리소스 찾는 명령을 보내지않고 캐시에 저장된 데이터를 클라이언트에게 돌려준다.

3번 그림

설정한 만료 시간 (100초) 를 지난 후에 같은 방식으로 요청을 보낸다.

이번에는 만료 시간이 지났기 때문에 캐시는 한번 검증을 해야한다.

변경된 값이 있는지를 체크해야 한다

그다음에 변경 사항이 없다면 304 상태 코드로 수정 사항이 없다는 것을 알리면서

시간을 갱신한 후 클라이언트로 돌려주는 과정이 되겠다.

캐시 검증

위 3번 그림에서 봤듯, 캐시의 만료시간이 지나면 문서를 다시 서버에 요청하여 가져와야 하는데

두가지 옵션이 있다.

ETags

ETags는 캐시 데이터와 함께 헤더에 고유 식별자를 붙여서 내려보내 주게 된다.

HTTP/1.1 200 OK
Cache-Control: max-age:100
Age: 0
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"

이런식으로 데이터가 내려가게 된다.

검증할 때에는 ETag 헤더값으로 데이터를 식별하고, 만료되어 새로운 캐시를 저장할 때에는

마찬가지로 ETag의 값도 새로 갱신하고 내려주게 된다.

아래는 깃허브에서 스프링 캐시에 대한 학습을 진행해보았다.

깃허브 바로가기

728x90

'CS' 카테고리의 다른 글

ALU 구현  (0) 2022.08.09
불 연산 회고  (0) 2022.08.09
불 논리 정리 2  (0) 2022.08.09
불 논리 회고  (0) 2022.08.07
728x90

모든 코드는 깃허브에 있음을 알린다.

ALU

열심히 한 끝에 결국 2장의 마지막 끝판왕 ALU까지 오게 되었다.

아 이 ALU를 하려고 1장부터 몇번을 다시 봤는지 모르겠고,

기초를 차곡차곡 쌓는게 중요하다고 다시한번 느낀 그런 날이다.

이전 내용은 2장 불연산 앞부분 회고를 참고하면 되겠다.

일단 ALU는 산술논리연산장치 로서

덧셈, 뺄셈 같은 두 숫자의 산술연산과 배타적 논리합, 논리곱,

논리합 같은 논리연산을 계산하는 디지털 회로이다.

ALU는 CPU의 내부 구성 요소중 하나이며, 실제적인 연산을 담당하는 하드웨어 모듈이다.

컴퓨터시스템의 다른 부품들은 사실 ALU가 연산하기 위해 처리될

데이터를 가져오거나,

그 결과를 저장하기 위한 용도라고 해도 틀린 말이 아니다.

ALU는 구성이 산술, 그리고 논리로 되어있다.

산술

ALU는 덧셈만 있지 나눗셈, 곱셉은 존재하지 않는다.

곱셈은 그냥 * 5 해줄것을 5번 더해주는것으로 생각하고

나눗셈은 / 5 해주는 것을 5번 빼주는식으로 해주면 된다.

그래서 ALU는 덧셈으로 산술연산을 모두 처리할 수 있다.

논리

이 논리 연산으로 같은 값인지? 다른값인지 누가더 큰지 이런것을 비교하여 값을 받을 수가 있다.

회로도

조건식은

  • zx
    • if zx then x = 0
  • nx
    • if nx then x = !x
  • zy
    • if zy then y = 0
  • ny
    • if ny then y = !y
  • f
    • if f then out = x + y else out = x & y
  • no
    • if no then out = !out

이 셀렉터들의 조건이 있다.

그리고 아래는 회로도를 직접 그려본 것이다.

IMG_2742

처음에 위의 저 조건들은 당연히 이해를 했다.

그래서 아 이것도 쉽구나 하고 쭉 구현해보려고 했는데 문제가 있는 부분은

현재 그림으로 no 셀렉터 값을 가진 16비트 멀티플렉서 를 지나는 지점부터 이해가 잘 되지 않았다.

왜냐면 생각이 안들기 때문이었다. ㅋㅋㅋㅋㅋㅋ

그러니까 기초가 부족했던 탓이라고 생각했다. 😅

이제 출력값이 세개였는데

Output : 16비트 출력
zr : out = 0 일때 True 출력
ng : out < 0 일 때만 출력

이 세개가 왜 나와야하는지 그리고 저게 뭘 의미하는지 사실 잘 몰랐었다.

근데 2장을 앞부분으로 되돌아가면

16비트는 정상 출력을해주고

out이 0보다 작다는 소리는 맨 앞부분이 부호비트 라는 것을 생각해보면

아! 맨 앞 비트를 뽑아주면 되는구나!

까지 생각했다.

그래서 저 두개 부분은 금방 해결을 했다.

마지막 해결 부분

마지막 out = 0 일때 True 출력

이 부분은 사실 8개씩 나누어 두개의 Or8Way 를 사용하였다.

비트를 압축해야 하는데 자른 8개의 비트중에 하나라도 1이라면 그냥 1이 되게 되어있다.

그래서 no 라는 셀렉터가 값을 반전시키기 때문에 전부 0이 나올때만 1로 출력되게 해주어야 했다.

그래서 Or8Way로 비트를 2개로 압축한다. 이 결과를 다시 Or조건으로 넣으면

16비트 전부 0이 나오면 이제 그 0을 반대값으로 환산해서 모두가 0일때

참으로 나와주게끔 구현을 한 것이다.

아래는 nand2tetris의 코드이다.

CHIP ALU {
    IN  
        x[16], y[16],  // 16-bit 입력        
        zx,
        nx,
        zy,
        ny,
        f,
        no;

    OUT 
        out[16],
        zr,
        ng;

    PARTS:

    // zx, zy
    Mux16(a=x, b=false, sel=zx, out=o1);
    Mux16(a=y, b=false, sel=zy, out=o2);

    //nx
    Not16(in=o1, out=noto1);
    Mux16(a=o1, b=noto1, sel=nx, out=o3);

    //ny
    Not16(in=o2, out=noto2);
    Mux16(a=o2, b=noto2, sel=ny, out=o4);

    // f연산
    And16(a=o3, b=o4, out=andxy);
    Add16(a=o3, b=o4, out=addxy);
    //add or and 정의해놓고 멀티플렉서로 선택함
    Mux16(a=andxy, b=addxy, sel=f, out=result);

    //no연산
    Not16(in=result, out=notresult);

    //위와 같이 not 구현해놓고 not연산에 해당하는 값을 멀티플렉서로 선택함
    Mux16(a=result, b=notresult, sel=no, out=out, out[0..7]=front, out[8..15]=back, out[15]=ng);

    Or8Way(in=front, out=frontout);
    Or8Way(in=back, out=backout);
    Or(a=frontout, b=backout, out=orout);
    Not(in=orout, out=zr);

}

결론

드디어 끝을 보니까 너무 후련했다.

위의 코드를 HardwareSimulator를 실행해서 테스트 케이스를 통과할 때의 그 기분은 느낀 사람만 알 것이다.

확실히 손으로 그려보고 딱딱 만들어 가는 과정이 나는 더 잘 맞는것 같다.

근데 이 고통을 겪어서 그런가 감히 다음장에 나오는 플립플롭, 레지스터에 도전하고 싶다.

728x90

'CS' 카테고리의 다른 글

Cache  (0) 2022.08.09
불 연산 회고  (0) 2022.08.09
불 논리 정리 2  (0) 2022.08.09
불 논리 회고  (0) 2022.08.07
728x90

불 연산 회고

이 2장 정리를 진작에 했어야 했는데 시간이 나지를 않아서 지금 포스팅하게 되었다.

모든 코드는 깃허브에 있다.

일단 저번 회고 때 마지막으로 정리했던것은 카르노맵 이었다.

카르노맵으로 뭔가의 공식들을 도출할 수 있으니까 논리식을 간소화한 후에 회로도를 셋팅하는 정도는 이제 무리가 없었다.

이게 정말 다행이었고 여기서부터는 이제 입력 값이 3개이기 때문에 3변수 카르노맵을 통해

풀게 되었다.

일단 2진수의 덧셈을 생각해보면 2진수는 0과 1로 이루어져있다.

일반적인 10진수에서 덧셈을 할때를 보면 10일때는 올림처리를 한다.

2진수도 마찬가지다 도합 2가 되면 올림처리를 해주는 것이다.

그것을 Carry라고 부른다.

KakaoTalk_20211023_155551656

자 반가산기 이다. 반가산기는 덧셈을 수행하는 가산기이며 입력값이 두가지 이다.

그러니까 처음 계산할 때 대부분 반가산기를 사용할 것이다.

2진수로 1 + 1 = 0 이 성립한다.

이때 X = 1, Y = 1인것이고 Carry(올림)이 1이다 왜냐면 저 0은 더해서 2가 되어서

올림 처리를 해주고 남은 0이라서 합계가 0이 되는 것이다.

그래서 진리표대로 잘 나오는 것을 확인하였고 이것을 토대로 카르노맵을

Carry의 입장, Sum의 입장에서 하나씩 구현을 했다.

이 반가산기는 언제쓰나 했더니 자세히 보니까 한자리 덧셈만 할 때,

이 때만 수행해준다.

전가산기

KakaoTalk_20211023_155551179

이 전가산기가 나온이유가 바로 위에서 반가산기 덧셈 후에

그러니까 맨 처음 덧셈을 수행할 때만 이렇게 해주고

나머지는 올림처리한 입력값 까지 같이 계산을 해야되니까

이 전가산기를 통해 나머지 연산을 해주어야 한다.

16비트 가산기

그래서 이 16비트 가산기가 설명을 하자면

예를들어 1111 + 1010 이 두개를 더한다고 해보자

1 1 1 1

1 0 1 0

맨 오른쪽인

1과 0을 보면 이제 이 부분이 반가산기로 연산을 수행하는 것이다.

1 + 0 은 0이고 Carry 또한 발생하지 않았기 때문에 그대로 진행하고 그 다음부터는 올린 수를 고려해야 하기 때문에

3개 입력 -> 이전 Carry 0 + 1 + 1이 되는 것이다.

HalfAdder

FullAdder

...

를 수행하게 된다.

이렇게 반가산기, 전가산기 두개로 가산기에 대해서 알아보았다.

ALU라는 2장의 끝판왕이 존재하는데 저번 회고에서

유튜브 페이지에 들어가서 Computer Science 탭에 ALU설명을 듣고나니까 구현할 수 있을것만 같다.

토요일에 구현해보고 다시 회고를 작성해보겠다.

728x90

'CS' 카테고리의 다른 글

Cache  (0) 2022.08.09
ALU 구현  (0) 2022.08.09
불 논리 정리 2  (0) 2022.08.09
불 논리 회고  (0) 2022.08.07
728x90

2진수

2진수는 0과 1로만 이루어져있는 수이다.

1bit의 단위를 가진다.

bit란?

2진수의 기본 단위이다.

패리티 비트

패리티 비트는 전달하는 데이터의 오류를 검증해주는 비트이다.

문자열 내 1비트의 모든 숫자가 짝수 또는 홀수인지를 보증하기 위해 전송하고자 하는 데이터의 각 문자에 1 비트를 더하여 전송하는 방법으로

2가지 종류의 패리티 비트(홀수, 짝수)가 있다. 패리티 비트는 오류 검출 부호 에서 가장 간단한 형태로 쓰인다.

실질적으로 오류를 확인할 수 있는 비트이지, 그 오류에 대한 해결을 할 수는 없다.

보수

보수는 사전적 의미로 보충을 해주는 수 라고 정의되어 있다.

숫자 2의 10의 보수는 8이 되는 것이다.

논리 회로에서의 보수는 뺄셈 연산을 할 때, 좀 더 효과적으로 수행하며

논리적 조작의 용이성을 위해 사용한다.

  • 1의 보수
    • 2^n -1 자리수 최대값에서 해당하는 이진수 값을 빼주면 그것이 바로 1의 보수
  • 2의 보수
    • 2^n - 1자리수 최대값에서 해당하는 이진수 값을 빼준 후에 1을 더해주는 보수

KakaoTalk_Photo_2021-10-30-15-58-08

1의 보수 감산

  1. 1의 보수 감산은 주어진 수들을 일단 2진수로 변환한다.
  2. 음수로 되어있는 수는 1의 보수를 취해준다.
  3. 서로의 자릿수가 다르다면 자리수를 맞춰준다.
  4. 앞에 양수면 0, 음수면 1의 부호비트를 붙여준다.
  5. 덧셈을 진행한다.
  6. 진행한 후에 자리올림(Carry)가 발생하면 최하위 비트에 1을 더해준다.

그 후 맨앞의 부호비트는 떼어놓고 나머지 수들의 자릿수만큼의 경우의 수(절대값)은

2^n-1에서 떼어놓은 나머지 수를 빼주고 10진수로 변환한다.

그리고 나서 부호비트를 표현해주면 그것이 보수감산하여 나온 값이 된다.

2의 보수 감산

2의보수는 1의보수 + 1 이기 때문에 1의보수 방법에서

보수로 변환을 해준 뒤에 + 1을 시켜준다.

마찬가지로 부호비트를 추가해주고 덧셈을 수행하면 된다.

그리고 나서 보수감산이 진행되고 나서 다시 +1을 해준다.

불대수 법칙

이전 포스팅에서도 정리를 했었는데, 다 알고있던건 수기로 작성했고

드모르간 정리는 저번 포스팅 때에 존재하였기 때문에,

제2 분배법칙을 따로 증명해보았다.

그게 바로 X + YZ = (X+Y)(Y+Z) 이런 법칙이다.

(X+Y)(X+Z)를 분배해서 일일이 나열하게 되면

XX + XY + XZ + YZ 가 되는데,

여기서 XX + XY를 X에 대해 묶어주면

X(1 + Y)가 된다.

기본법칙에서 1 + 변수는 1이되므로 생략이 된다.

그래서 저 식을 풀면 그냥 X가 된다.

정리를해보면 X + XZ + YZ 가 남게 되는데 여기서 또,

X에대해서 X + XZ를 묶어주게 되면

X(1 + Z)가 되어서 또다시 X가 된다.

그래서 최종적으로 보게 되면 X + YZ 가되어 두식이 같다는걸 증명했다.

이제 좀 탄력을 받아서 ALU 구현하는데에 도전해볼 것 같다는 확신이 든다.

유튜브 페이지에 들어가서 Computer Science

아주 좋은 강의가 순서대로 있었다.

논리게이트부터 CPU까지만 지금 들었지만 굉장히 이해하기 쉽고 재밌게 설명해서

보면서 감탄만 한것 같다.

728x90

'CS' 카테고리의 다른 글

ALU 구현  (0) 2022.08.09
불 연산 회고  (0) 2022.08.09
불 논리 회고  (0) 2022.08.07
HTTP  (0) 2022.08.07
728x90

첫 일기

코드는 깃허브에 있다.

CS bool 정리 와도 연관이 되지만, 좀 자유롭게 쓰고 싶어서

이렇게 일기 카테고리로 작성한다.

들어가면서

우선은 나와 같이 노력해주시는 창훈님과 밑바닥 컴퓨팅 시스템을 같이

오프라인 스터디로 진행하고 있다.

처음엔 둘다 멋대로 또는 자기가 머릿속으로만 생각했던 대로 nand2tetris를 구현했었는데, 진행하다 보니까

뭔가 제대로 잡히질 않았다..

태초마을로..

그래서 논리게이트 하나씩 알면서 그리고 진리표를 보았을 때, 어떤 게이트들을 써서 구현을 해야하는지..

그런 개념을 확립하고 머리로만 짜는게 아니라 삽질도 해가면서 논리식으로 표현하는게 목표였다.

그래서 2장을 진행하다가 다시 1장으로 돌아오게 되었다. ㅋㅋㅋㅋㅋ 근데 결과적으로 얻어간 지식이 더 많은것 같다.

이게 대학교 때 물론 내가 기계쪽이 전공이지만, 디지털 논리 회로라는 과목에서 했던것들이다.

주의깊게 보지 않았었을 뿐더러, 교수님이 강의해주실 때는 되게 재미가 없었고, 왜 배워야하는지 어디에 쓸 수 있는건지

그렇게 생각하며 무난하게 보냈던 과목인거같다.

새롭게 지금 CS지식을 학습하며 이 책에서 구현해야하는 조건들을 하나하나 카르노맵도 그려가면서,

또는 집합을 그려가면서 구현해보니까 이 진리표일땐, 이렇게 구현이 되는구나! 를 많이 느꼈던 것 같다.

일단 불대수 법칙에는 아래 이미지와 같은 법칙들이 명시되어 있다.

이건 수학을 배울때에도 봤던 기억이 있어서

그렇게 어렵지 않았다.

스크린샷 2021-10-24 오후 11 12 10

고생했던 자료의 흔적


논리식 부딪히기

KakaoTalk_Photo_2021-10-24-22-40-16

이부분은 처음에 논리식을 파헤치려 할 때 이해 안되는 부분 그리고 왜 그렇게 나오는지에 대해 설명하기 위해

밴-다이어그램을 그려가면서 설명하면서 의논을 했던 부분이다.

논리식 도출해보기

KakaoTalk_Photo_2021-10-24-22-40-00

어느정도 이해를 한 상태에서 진리표를 보고 집합으로 값을 도출하는 과정이다...

ㅋㅋㅋ 이렇게 정리하면서 보니까 안까먹겠다 싶더라 역시 쓰면서 대화도 해보고 팍팍 부딪히면서 학습하는게

기억에도 잘남고 동시에 보게되면 바로 아! 하고 깨닫게 되는 순간이 훨씬 많다는 사실..

정말 많이도 그렸고 단순한 And, Or 인데도 불구하고 애를 먹었다.

논리식을 도출할 때 a와 b에 해당하는 진리값을 곱해서 나온게 output인데 And, Or에 따라서
곱으로 도출하는것, 합으로 도출하는것 그 논리 합, 곱 이게 섞이면서 식을 몇번을 갈아 엎었다.

카르노맵을 생각해냈다!!!

KakaoTalk_Photo_2021-10-24-22-40-08

이제 머리로만 간소화해서 짜다가는 필요에 의해서 카르노맵 이 있다는걸 생각해냈고,

검색을 통해 2변수, 3변수, 4변수 등등의 카르노맵을 그리는 법,

그러면서 짝수개를 묶어서 값을 도출해낼 수 있다는 지식까지 습득한 채로 다시 논리식을 도출해보게 되었다.

결국 모양으로 쳐둔 것들이 최종 값인데 곱연산은 And, 합연산은 Or 이런식으로 '기호는 Not으로 해서
게이트를 연결해보았다.

그러니까 이해도 되면서 어떻게 동작하는지도 알겠고 너무 재밌더라 👍

이때부턴 탄력받아서 아래것들도 쭉쭉 진행했었다 🔥🔥🔥

2변수 카르노맵 간단 풀이

Y
X
0 1
0 0 1
1 1 1

Or의 진리표이다. 이 진리표가있을 때 짝수개는 인접한것 끼리 묶을 수 있다고 했다.

  • X가 1일때, Y값에 관계없는 경우 (Y, Y' 둘다 상관없다)
  • Y가 1일때, X값에 관계없는 경우 (X, X' 둘다 상관없다)

두가지로 도출해 볼 수 있다.

두가지는 + 로 연결이 된다.

그래서 Out = X + Y 가 되는 것이고 그래서 논리합 이라고 부르는 것이다❗️

이게 트이니까 정말 재밌어서 얼른 하나라도 더 빨리 풀어보려고 했던 것 같다.

KakaoTalk_Photo_2021-10-24-22-39-53

KakaoTalk_Photo_2021-10-24-22-39-43

KakaoTalk_Photo_2021-10-24-22-39-31

정리

아무튼 이런식으로 진행해서 재밌고 잘 이해되게 1장을 클리어한 것 같다.

다음 다이어리에선 반가산기, 전가산기 쪽을 다뤄보도록 하는 시간을 가져보겠다. 👏

뭔가 이렇게 풀이해내는 것이 읽는것도 읽는 맛이 나고 뭘 어떻게 했는지 보이게 되는것

그게 직관적이라 상당히 괜찮은것 같기도 하다. 물론 이미지 찍어서 업로드 하는것이 번거롭지만

그래도 또 어제의 나보단 한 층 더 성장했으니까 그거로 만족한다 😇

타인과 비교하지 않고 혼자 성장치를 잘 쌓다보면 언젠가는 주변에 좋은 개발자들과 어깨를 나란히 할 수 있는 날

그날이 올거라고 반드시 믿는다.

728x90

'CS' 카테고리의 다른 글

불 연산 회고  (0) 2022.08.09
불 논리 정리 2  (0) 2022.08.09
HTTP  (0) 2022.08.07
불 논리 정리  (0) 2022.08.07

+ Recent posts