본문 바로가기

반응형

전체 글

(32)
Codility FloodDepth 바위들 중, 가장 깊은 웅덩이의 깊이를 알아내는 문제입니다. 이 문제의 알고리즘은 바위의 가장 높은 곳을 가르키는 peak와 새로운 peak가 나오기 전까지의 가장 낮은 바위의 row값을 알아내어 그 차를 구해 가장 큰값을 구하는 알고리즘 입니다. 1. 웅덩이가 발생하는 곳을 알아내는 것(내리막이 발생하는 지점), 만약 웅덩이가 발생한다면 현재까지의 웅덩이 중 가장 낮은지 row와 비교한다. 2. 오르막이 발생한다면, 웅덩이가 발생하는 곳 이전에 있던 바위들 중의 가장 높은 바위의 길이(peak)와 오르막이 발생한 지점의 바위높이 중 낮은 바위의 높이에서 지금까지 가장낮은 바위높이인 row값을 빼줍니다. depth = min(peak, rock[index+1]) - row 3. 이때, 새로운 peak가 ..
Codility RectangleBuilderGreaterArea 이 문제는 N이 100,000개 까지 나올 수 있으므로 N^2 이상의 알고리즘으로 풀면 안됩니다. 다행히 펜스의 너비가 같더라도 가로와 세로길이가 다르면, 다른 종류의 펜스로 인정하니 만들수 있는 장대의 길이를 오름차순으로 정렬하여 어떤 index부터 X의 너비이상을 만족하는지 찾으면 N*log(N) 시간에 펜스의 종류를 확인할 수 있습니다. 1. 같은 길이의 장대가 2개 이상인 장대를 list에 할당한다. 2. 장대를 하나 정하고(A) 그 장대로 X너비 이상의 펜스를 만들 수 있는 최소길이의 장대(B)를 찾는다. (이분탐색) 3. 전체 장대길이 - 최소길이의 장대(B) index한 만큼 만들 수 있는 펜스의 종류이므로 이 값을 누적시킨다. 4. A 장대가 4개 이상이면, A장대만으로 펜스를 만들 수 있..
Kubernetes worker-node join 시, Unauthorized가 발생하는 경우 Kubernetes worker-node에서 master-node로 연결하는 join 명령어 입력시, 아래와 같이 에러메시지가 나며 연결이 안되는 경우가 발생했습니다. [kubelet-check] Initial timeout of 40s passed. error execution phase kubelet-start: error uploading crisocket: Unauthorized 어떤 이유로 master-node에서 발행한 token이 만료된 상태로 추정되어 master-node를 다시 running상태로 만든 후, 계속 join 연결을 시도했지만, 여전히 동일한 에러가 발생했습니다. 알고보니, worker-node쪽에서도 master-node에 대한 token 정보를 저장한 정보가 남아있을 수 ..
C++ string tokenizing C++의 문자열은 다루기가 쉽지 않습니다. string tokenizing도 예외는 아닙니다. 흔히 사용하는 string class를 사용해 tokenizing하는 예시는 아래와 같이 합니다. stringstream ss(input); string token; string tokens[4]; for(int v=0; getline(ss, token, ',');v++){ tokens[v] = token; } 하지만, 이 코드도 잘림의 기준이되는 delmiter가 문자열이 아닌, 문자인 경우에만 사용할 수 있습니다. 만약 문자열을 기준으로 자르려면, strtok을 사용해야 합니다.
C++ 완벽한 replaceAll 구현하기 C/C++ 는 문자열을 다루긴엔 정말 성가십니다. 심지어는 Java나 Python에도 기본으로 제공하는 대상이되는 문자열을 모두 치환하는 replaceAll api도 없습니다,, 아니, 정확히는 문자열이 아닌, 문자 1개를 교체해 주지만요,, 아래처럼 x에 해당하는 모든 문자의 위치를 while로 찾고, 찾은 위치의 문자를 y로 교체 합니다. #include #include int main() { std::string s = "C**"; std::string x = "*", y = "+"; size_t pos; while ((pos = s.find(x)) != std::string::npos) { s.replace(pos, 1, y); } std::cout
Spring Security 여러개 적용하고, Admin page에서 일관된 password로 로그인하기 웹 서비스를 운영하다보면 관리자가 일반유저의 계정으로 로그인이 필요한 경우가 있습니다. 예를 들면, A라는 사용자가 로그인했을 때, 로그인된 화면에 당연히 보여야될 메뉴나 데이터가 없는 경우, 관리자에게 문의를 합니다. 관리자는 A 사용자의 현황을 모니터링할 목적으로 A 사용자의 계정으로 로그인 합니다. 하지만, A 사용자의 비밀번호를 직접적으로 물어볼 수 없으니, 다른 방법으로 인증을 해야합니다. 이번 포스팅에선 이런 상황을 위해 일반유저와 관리자 로그인 페이지를 나누고, 관리자가 일반유저의 계정으로 임의의 password로 로그인할 수 있는 방법에 대해서 소개합니다. 편의를 위해 일반사용자는 User, 관리자는 Admin으로 표현하겠습니다. User는 account/form-login을 통해, Adm..
OpenCSV로 쌍따옴표(Double quote)와 개행(Carriage return)이 포함된 CSV 파싱하기 포스팅 제목부터 범상치 않은데요, CSV파일을 다루면서 파싱하는데 어려움이 있던 부분을 포스팅합니다. Java OpenCSV 라이브러리를 사용했구요, Gradle에서 아래와 같이 추가하면 됩니다. implementation 'com.opencsv:opencsv:5.3' 문제의 CSV본문은 사람이 입력한 자연어 그대로 들어가기에 파싱되는 필드내에 콤마(,)와 쌍따옴표("), 개행(\n)까지 들어있을 수 있습니다. 예시는 아래와 같습니다. "1","김철수","일반회원","교정진료를 ""희망""합니다, 잘부탁드립니다." "2","홍길동","일반회원","스케일링을 희망합니다, 1달에 2번" 예시를 보면 쌍따옴표로 묶인 필드 내에 콤마와 개행, 심지어 쌍따옴표까지 혼합해서 나온 경우를 보실 수 있습니다. 상당히 ..
CentOS8 에 yum repository가 없을 때 최근에 CentOS8에 Docker를 설치하려는데, 역시나 한 번에 되는 법은 없었습니다. 설치된 CentOS8에는 /etc/yum.repo.d/에 repository 설정파일이 비어 있더라고요. 한참을 헤매다 적절한 repo url을 찾아서 제가 사용했던 repo설정파일을 공유합니다. 아래 파일은 redhat.repo 파일입니다. [AppStream] name=AppStream baseurl=http://mirror.centos.org/centos/8-stream/AppStream/x86_64/os enabled=1 gpgcheck=0 [BaseOS] name=BaseOS baseurl=http://mirror.centos.org/centos/8-stream/BaseOS/x86_64/os/ enable..

반응형