본문 바로가기

단편글

(12)
URI에서 IPv6 사용 IPv6가 나온지 꽤 오랜 시간이 지났지만 여전히 IPv4 주소를 많이 사용한다. 내가 지금까지 했던 서버통신 IP 주소체계도 대부분이 IPv4 였다. 그런데 갑자기 규격이 변경되면서 IPv6를 쓴다고 한다. 그래서 팀장님이 지금 작업하고 있는 LWM2M client에서 IPv6를 사용가능한지 물어보셨다. 당연히 가능하져! 라고 말은 했지만, 역시 직접 테스트를 해보아야 한다. LWM2M으로 서버와 통신을 할 때, CoAP URI를 만들어서 서버에 Register를 보내야한다. 예를 들어 IP 주소가 192.168.1.13 이고 포트가 15683 이면 coap://192.168.1.13:15683 이 통신할 CoAP URI가 된다. 진짜 간단하게 생각하면 IPv6 주소도 그냥 넣으면 된다. 그런데 문제가..
Linux에서 JNI 쓸 때 라이브러리 문제 요즘 프로젝트에서 JAVA를 많이 쓰고 있다. 규격서에 JAVA를 명시해두었기에 우리 팀 프로젝트중에서 유일하게 JAVA를 쓰는 프로젝트를 하고 있기 때문이다. 학부 때 이후로 JAVA를 쓴 적이 없으니 5년은 안쓴 것 같다. 원래 자바를 메인으로 하던 사람이 아니라 좀만 복잡한게 나오면 골머리를 앓고 있다. 특히 가장 문제가 되었던게 이 JNI. 임베디드 특성상 하드웨어 제어를 자주 해야한다. 간단한 Serial 통신이면 exec로 하면 되는데, 문제는 다른 C/C++ 라이브러리를 가져와야 할 때이다. 처음에는 JNA를 쓰려고 했는데, JNA는 C++은 못쓴다고 해서, 또 JNI 함수까지 규격서에 정의가 되어 있어서 어쩔수없이 JNI로 갈아타게 되었다. Header 만들고, C작성하고, so파일 만드는..
struct tm 을 쓸 때 하는 실수들 기능 개발을 하면서 가져온 데이터의 시간을 파싱하는 일을 많이 한다. 보통 가져온 데이터들은 앞 7자리를 시간으로 나타내는데, 년도 2bytes(년도를 통채로 hex화 한다. 즉, 2020년이면 07 e4가 된다.), 월 1byte, 일 1byte, 시 1byte, 분 1byte, 초 1byte로 표시한다. 이렇게 가져온 시간값을 비교하는 작업을 종종 하는데, 할 때마다 자꾸 실수를 하여 금방 끝날일을 오래 걸리게 한다. 이렇게 나뉘어져있는 값을 편하게 비교하기 위하여 time_t로 바꾸어 비교하면 간단히 상수 비교를 할 수 있어 이런 식으로 종종사용한다. 여기서 자주 실수하는 일은 선언한 struct tm 을 초기화하지 않는 것이다. struct tm을 초기화 하려면 localtime을 이용하여 초기화..
DP 문제. 어렵다 프로그래머스에서 가장 큰 정사각형 찾기 문제를 풀어보는데, 이건 좀 힘들었다. 처음 생각한 방식은 for문 두 개를 돌려서 1인 경우를 찾고, 만약 1이면 우측과 아래로 한칸씩 늘려가면서 정사각형이 맞나 확인하는 방식이였다. 근데 이렇게 하면 for문이 거의 3, 4개가 사용된다. 즉, 복잡도가 O(N3) 이 된다. 그래서 이번에는 힌트를 좀 참조했다. DP (Dynamic Programming) 을 사용하는게 가장 좋다고 한다. 와. DP 는 학부때도 잘 배운 기억이 잘 안난다. 찾아보니 DP, 동적계획법이란게 작은 문제를 모아서 큰 문제를 푸는 것이더라. 학부 때 피보나치 수열 푸는 방법을 교수님이 설명해줄때, 이야기 해주셨던 방법 중 하나였다. 하나는 재귀함수였고, 다른 함수는 이 동적계획법이였다...
모든 조합을 구하는 문제 (순열) 나온 문제는 숫자가 지정되면 가능한 모든 순열을 구하고, 소수의 개수를 구하라는 문제였다. 처음에는 직접 경우의 수를 다 구할려고 했는데, 코드도 엄청 길어지고, 복잡하더라. 거의 대부분의 수학적인 문제는 이미 라이브러리에 구현되있으니 찾으면 나올꺼라 생각했고, 역시나 나왔다. permutation 함수 자체가 이미 있었다. 그래서 나온 방법들은 대부분 비슷했다. do-while 문을 이용하여 다음 수열을 계속해서 만드는 것. 그런데 그냥 do-while문만 하면 총 길이와 같은 경우의 수만 나온다. {1, 2, 3, 4} 가 있으면 1234 1243 1324 1342 1423 1432 2134 2143 2314 2341 2413 2431 3124 3142 3214 3241 3412 3421 4123 4..
priority queue와 vector의 최소값 vector 에서 최소값과 그 다음 최소값을 빼내어 계산하여 넣고를 반복하는 문제가 나왔다. 처음에는 vector를 deque에 넣어서 sort로 정렬하여 문제를 풀었다. sort(deque.begin(), deque.end()); int less = deque.front(); deque.pop_front(); int less2 = deque.front(); deque.pop_front(); 이 방식을 사용하니 실행시간이 너무 느리게 나와서 효율성 검사에서 전부 실패했다. 찾아보니 C++ 의 sort 는 퀵정렬 기반이여서 O(NlogN)의 시간복잡도를 가진다고 한다. 그래서 좀 더 빠른 방법을 찾다가 priority queue를 찾았다. 사실 학부때에도 priority queue는 써본 기억이 거의 없다..
괄호와 스택 문제중에 괄호 관련된 문제가 종종 나온다. 아마도 개발하다보면 괄호가 부족해서 오류가 나오는 경우가 종종 발생해서 그런가보다. 간단한 문제로는 괄호가 잘 닫혔는지 확인하는 문제가 나오고, 더 나아가서는 특정 패턴으로 불완전한 괄호를 완성시키는 문제가 나온다. 이런 괄호가 정상적으로 매칭되어있는지 확인할 때, 스택을 사용한다. 여는 괄호가 있으면 닫힌 괄호가 있을테니 각각의 괄호를 카운트해서 숫자가 같으면 맞다고 판단하는 방법을 쓰면 갯수는 맞지만, 괄호의 순서가 다른 경우에는 오답이 된다. 그래서 스택을 써서 괄호가 여는 괄호일때는 스택에 넣고, 닫힌 괄호일때는 여는 괄호를 빼내는 방법을 사용한다. bool complete(string u) { stack s; for(int i=0; i
BFS 학부 때 이후로 오랜만에 BFS를 사용했다. 격자에서 영역을 구할 때 사용하였다. 이해한 대로 PPT를 이용하여 간단하게 그려보았다. 기본 원리는 주변을 살펴서 내 그룹이고, 방문 안했으면 queue에 넣고, 다 확인하면 queue에서 다음 것을 빼내어 똑같이 하는 것이다. 학부때는 이걸 재귀함수로 했던것 같은데, queue로 하는게 더 쉬운것 같다. queue에 pair를 사용했는데, 행렬을 각각 넣기 위해서 그랬다. for(int i=0; i