2019.10.11 Fri 20:30

정말 오랫만인거 같습니다.

우선 한동안 많은 일이 있었고 하고싶은 말이 많지만 우선 가장 큰 변화를 이야기 해볼까합니다.

2달 전 마지막 일지를 쓸 때와는 다르게 보안 동아리가 하나 생겼습니다.

이름은 INFO, 대마고의 몇 안되는 보안 동아리입니다.

몇 안되는 보안 동아리인 만큼, 저는 동아리 내부에서의 성과가 필요하다고 생각했죠.

그래서 wargame 사이트를 직접 만들어보는 계획을 추진했었는데, 결론적으로 어제 완성이 되었습니다.

저는 wargame 사이트의 Cryptography 장르의 문제 출제를 주로 맡고 있습니다.

처음 만든 wargame 이다 보니, 많이 미숙하게 낸 문제들도 있겠죠.

그래도 많은 사람들이 들려줬으면 하는 바램입니다.

감사합니다 :)

 

http://infowargame.slowmotion.dev

 

====================================================================

 

재개발 중입니다.

전부 갈고 새로 만들고 있습니다, 2020년중으로 새롭게 만들어 질 계획입니다.

'개발 일지' 카테고리의 다른 글

base64 알고리즘에 관하여  (0) 2019.08.01
시간복잡도에 관하여  (0) 2019.05.11
code up을 재업할까 합니다! :grin:  (0) 2019.03.19
오늘부터 블로그 시작합니다:grin:  (0) 2019.03.19

2019.08.01 Thu 17:02

굉장히 오랫만에 일지를 씁니다.

그 이전에 글 자체도 굉장히 오랫만에 쓰는 것같군요.

자주 일지를 남겨보겠다는 취지로 첫 글을 올린지 거의 3달만이군요.

글 자체는 2주만인가요?

어쨌든 이번 일지에서는 방금 전에 프로젝트에 사용될 코드를 만드느라 잠시 base64 알고리즘을 구현할 일이 있었는데, 이것도 일지로 적어보면 괜찮을 것 같다는 생각이 들어서 써봅니다.

 

이번에 소개할 것은 base64라는 간단한 암호화 기법입니다:)

base64는 바이너리 데이터를 문자 코드에 영향을 받지 않는 공통 ASCII 문자로 표현하기 위해 만들어졌는데요.

여기서 ASCII 문자 하나가 64진법의 숫자 하나를 의미하기 때문에 base64라고 부릅니다.

원리는 간단합니다. 8비트짜리 바이트 3개를 6비트씩 4개로 쪼개어 base64코드 4개로 바꿉니다.

그리고 base64 코드를 4글자 단위로 만들고, 빈부분을 '=' 문자로 채워둡니다.

 

예를들어 Ny4N을 인코딩해보면 이렇게됩니다.

 

base64 encrypt

6비트로 나누어떨어지도록 아무것도 없는 값을 채우고, 그 남는 공간만큼을 =으로 채우게 됩니다.

그래서 Ny4N을 base64로 인코딩하면, Tnk0Tg==이 됩니다.

변환 값을 암호문으로 바꾸는 변환표는 000000부터 순차적입니다.(단, 빈 공간을 채우기 위해 들어간 값은 =으로 구분합니다.)

출처 : 나무위키 -> BASE64 변환표

이를 이용하여 심심풀이삼아 base64를 c언어로 구현해보았는데, 이는 개인개발자료에서 다루도록하겠습니다:)

2019.05.11 Sat 14:15

이번 일지를 기준으로 가끔가면서 기억에 남는 일이 있으면 차례대로 써서 기록을 남겨보기로 했습니다.

이런식으로 일지를 써보는 건 처음이라 조금 걱정되기도 하네요.

우선 한가지 반성하면서 넘어가 볼 일을 써볼까합니다.

오늘 공주대학교 정보보호영재원 수업은 python과 알고리즘이었습니다.

이곳에서 받은 강의 자료에서 제가 한 가지 잊고서 공부하지 않고 있던 것을 발견할 수 있었습니다.

바로 시간복잡도입니다.

시간복잡도의 개념만 알고 나중에 알아둬야지 하고 넘기다가 지금까지 공부를 안해놓은 자신을 발견할 수 있었습니다.

그래서 오늘의 일지는 오늘 공부한 시간복잡도에 대해서 남겨보려고 합니다.

 

big-O Name
1 Constant
log n Logarithmic
n Linear
n log n Log Linear
n^2 Quadratic
n^3 Cubic
2^n Exponential
  • O(1)
    1. Constant, 즉 1이 의미하는 바는 상수 시간을 의미합니다.
    2. 입력되는 n이 주어질 때, 알고리즘이 문제를 해결하는데 오직 한 단계만 거칩니다.
  • O(log n)
    1. Logarithmic, 즉 고정된 밑이 몇 번 제곱되는지에 대한 시간을 의미합니다.
    2. 밑을 2라고 생각하였을 때, n의 입력값이 16이면 알고리즘 수행 시간은 4가 됩니다.
    3. 따라서 데이터 양이 많아져도, 그에 비한 시간은 조금씩 늘어납니다.
    4. Binary Search, 즉 이진 탐색의 코드에서 주로 나타나는 시간복잡도입니다.
  • O(n)
    1. Linear, 즉 선형이므로 데이터 양에 따라서 시간이 정비례합니다.
    2. linear search, for문을 통한 탐색의 코드에서 주로 나타나는 시간복잡도입니다.
  • O(n log n)
    1. log linear, 즉 데이터 양이 n배 많아지면, 실행 시간은 n배보다 조금 더 많아지는데, 정비례는 하지 않는다.
    2. n이 두배로 늘어나면 실행 시간은 2배보다 약간 더 많이 늘어난다.
    3. Quick sort, Merge sort 방식의 정렬 알고리즘에서 주로 나타나는 시간복잡도입니다.
  • O(n^2)
    1. Quadratic, 즉 데이터 양에 따라 걸리는 시간은 제곱에 비례합니다.
    2. 제곱하는 만큼 n값이 커질수록 걸리는 시간이 비효율적으로 늘어나게됩니다.
    3. 이 유형은 이중루프내에서 입력 자료를 처리하는 경우 나타납니다.
    4. 2중 for 문을 사용하는 bubble sort, insertion sort와 같은 정렬 알고리즘에서 주로 나타나는 시간복잡도입니다.

그 외에도 n!와 같이 팩토리얼 형식의 시간복잡도도 쓰이지만, 여기서는 언급하지 않고 넘어가겠습니다.

각각의 시간복잡도들의 성능만 따져본다면

O(1)>O(log n)>O(n)>O(n log n)>O(n^2)>O(n!)

가 됩니다.

정말 시간복잡도도 제대로 파악할 줄 몰라왔으면서 지금까지 잘도 시간초과가 나지 않도록 코딩해왔다는 생각이 들었습니다.

사실 이론으로 설명해놓은 이 정리보다는 직접 예시 코드를 보고 이해하니 금방 이해할 수 있었습니다.

한 번만 읽어봐도 코딩하면서 머리를 좀더 효율적이게 굴리며 코딩해올 수 있었을 간단한 내용들인데, 그 간단하다고 말하는 내용을 미뤄두면서 안해왔던 저를 반성하는 시간이 된 것 같습니다.

음, 첫 번째로 쓰는 일지..라 해야할까 일기에 더 가까운 것 같군요.

처음 쓰는 방식이라 두서없이 내용이 길어진 것 같습니다.

다음번에는 좀 더 정리해가며 일지를 써야될 것 같네요.

http://codeup.kr


아마도 앞으로 code up 문제를 풀 때 사용되는 계정이 2016년도에 처음 가입하고 150문제 정도를 풀고 나서 뭔가 아닌 것 같아서 백준으로 갈아타면서 그대로 방치됐던 계정입니다.

이 계정을 살려내려는 이유는 code up 내부에 대덕소프트웨어마이스터고등학교 그룹 내의 랭킹이 있다고 들었습니다.

그래서 한 번 랭킹이나 올려놓으려는 생각과 블로그에 글 분량들 좀 늘려보려는 생각으로 재업할 예정입니다.

오늘부터 code up도 재업합니다.

잊혀진 계정의 이야기

대덕소프트웨어마이스터고등학교에 이번에 입학한 학생입니다.

한동안 이 계정을 만들어만 놓고 완전히 잊고있었는데,학교측에서 블로그를 만들어서 프로그래밍한 내용을 작성하라는 이야기를 듣고, 이 계정이 생각났습니다.

오늘부터 조금씩 백준 문제들을 풀어서 올리거나, 개인 개발하는 과정을 조금씩 올리면서 시작해보도록 하겠습니다.

+ Recent posts