[Bronze II] 중복을 없애자 - 4592문제 링크성능 요약메모리: 14556 KB, 시간: 132 ms분류구현문제 설명Al의 초콜릿 망고 회사는 방문자들이 2d 단지에 얼마나 많은 초콜릿 망고가 있는지 추측할 수 있는 웹 사이트를 갖고 있다. 방문자들은 1부터 99까지의 수를 추측한 후 "제출" 버튼을 누르는데, 안타깝게도 서버로부터 응답시간이 종종 길어져 방문자들이 이성을 잃은 나머지 "제출"을 연타하는 사태가 발생한다. 이게 우리가 해결해야 할 문제다.ACM의 직원을 도와 연타된 중복을 걸러보자.입력각 줄마다 처음으로 정수 N(0 마지막 줄에 입력의 끝을 알리는 0이 주어진다.출력각 케이스마다 한 줄씩 연속하는 중복을 제거한 원래의 제출 상태를 출력한다.각 줄의 마지막에는 한 칸을 띄고 '$'..
전체 글
우당탕탕 개발 블로그[Silver III] 2 타워 - 10407문제 링크성능 요약메모리: 14280 KB, 시간: 104 ms분류수학, 정수론문제 설명2 타워의 높이 H는222⋅⋅⋅2\[2^{2^{2^{\cdot^{\cdot^{\cdot 2}}}}}\]에서 숫자 2가 나타나는 횟수로 정의된다. 2 타워의 값은 해당 표현식의 값으로 정의된다. 예를 들어, 높이 1의 2 타워 값은 2이고, 높이 2의 2 타워 값은 4이며, 높이 4의 2 타워 값은2222=65536\[2^{2^{2^{2}}} = 65536\]이므로 높이 5의 2 타워 값은 265536이며 이 값은 2003...6736이고 다 쓰기에는 여백이 부족하다.H의 값이 커짐에 따라 2 타워의 값이 너무 커지므로, 우리는 이 값을 3으로 나눈 나머지만이 궁금하다.입력입..
[Bronze I] 하늘과 핑크 - 31473문제 링크성능 요약메모리: 16264 KB, 시간: 128 ms분류수학, 애드 혹문제 설명시현이의 방구석에 핑크색 머리카락과 하늘색 머리카락이 각각 N$N$개씩 떨어져 있었다!시현이는 이것들이 단비 양의 머리카락이라고 확신했다.시현이가 열심히 머리카락들의 길이를 잰 결과 i$i$번째 핑크색 머리카락의 길이는 Ai$A_i$였고, i$i$번째 하늘색 머리카락의 길이는 Bi$B_i$였다. (1≤i≤N)$(1 \leq i \leq N)$ 열심히 머리카락들의 길이를 재고 나니 시현이는 |a∑i=1NAi−b∑i=1NBi|$\left | a\sum_{i=1}^N A_i - b\sum_{i=1}^N B_i \right|$를 최소화할 수 있는 −1000000$-1\,000\,..
들어가며웹소켓은 실시간 양방향 통신을 가능하게 해주는 기술입니다.채팅 앱이나 실시간 알림, 게임 등에서 자주 활용되죠.이번 글에서는 웹소켓이 등장하게 된 배경부터 기존 방식과의 비교, 그리고 실제 동작 원리까지 차근차근 정리해보려 합니다.실시간 통신이 필요한 이유초기의 웹 통신은 기본적으로 요청-응답 기반의 HTTP 모델을 따랐습니다.클라이언트가 요청을 보내야만 서버가 응답하는 구조였죠.하지만 이 구조는 실시간성이 중요한 서비스에는 한계가 있습니다.예를 들어, 사용자 A가 채팅을 입력했을 때 사용자 B가 즉시 그 내용을 받아야 합니다.이걸 구현하려면 서버가 클라이언트에게 능동적으로 메시지를 보내야 하죠. 하지만 HTTP만으로는 그게 불가능했습니다.웹소켓 등장 이전의 통신 방식Polling가장 단순한 방식..
✨ 들어가며비밀번호는 단순히 저장하는 것이 아니라 안전하게 암호화되어야 합니다.이를 위해 우리는 일반적으로 해시(Hash) 함수를 사용하고, 여기에 Salt를 추가해 같은 비밀번호라도 다른 결과가 나오도록 처리합니다.하지만 해커의 능력도 진화하고 있습니다.Salt만으로는 부족할 수 있는 상황에서, 한층 더 강력한 보안을 위해 사용되는 것이 바로 Pepper입니다.🌶️ Pepper란?Pepper는 비밀번호 해시 처리 시 추가로 사용하는 비밀 문자열(secret value)입니다.Salt와는 다르게, 모든 사용자에게 공통으로 사용되며, 코드 또는 별도 보안 저장소에 저장됩니다.🔐 Salt: 사용자마다 다름 (DB에 저장됨)🌶️ Pepper: 모든 사용자에게 공통 (코드 내 또는 별도 저장소에 숨김)🧂..
✨ 들어가며비밀번호나 인증 정보를 보호하는 보안 기술이 발전하면서, 이를 우회하려는 해커들의 공격 방식도 정교해지고 있습니다.그중에서도 무차별 대입(Brute Force) 공격은 가장 오래되고 기본적인 공격 방식 중 하나입니다.단순하지만 여전히 위협적인 이유는 무엇일까요?💡 무차별 대입 공격이란?Brute Force Attack, 즉 무차별 대입 공격이란공격자가 가능한 모든 비밀번호 조합을 하나씩 입력해보며정답(올바른 인증 정보)을 찾는 공격 방식입니다.✔️ 수동이 아닌 스크립트나 자동화된 봇을 이용해 수백만 번의 조합을 빠르게 시도합니다.✔️ 공격 대상은 웹사이트 로그인, SSH, API 인증 키, ZIP 파일 등 다양합니다.⚙️ 작동 원리공격 대상이 되는 로그인 화면이나 인증 포인트를 찾습니다.자동..
✨ 들어가며웹사이트나 시스템에 가입할 때, 내가 입력한 비밀번호는 어떻게 저장될까요?단순히 "apple123"처럼 저장된다면 보안상 너무 위험하겠죠. 그래서 보안 시스템은 해시(Hash) 함수를 사용해 암호화합니다.하지만 같은 비밀번호를 입력하면 같은 해시값이 나오기 때문에, 해커는 이를 통해 여러 계정이 동일한 비밀번호를 사용하는 것을 유추할 수 있어요.이 문제를 해결하기 위해 등장한 것이 바로 Salt입니다.🧂 Salt란 무엇인가?Salt는 해시 연산 전에 비밀번호에 무작위로 추가하는 문자열입니다.이 값을 덧붙이면 같은 비밀번호라도 완전히 다른 해시값을 만들 수 있어요.예시:비밀번호: "apple123"철수의 Salt: "xyz789"영희의 Salt: "abc123"철수 해시: Hash("apple..
개요Keycloak을 통해 사용자 인증 및 관리를 하고 있는 프로젝트에서, 사용자 삭제가 아닌 사용자 비활성화(disable) 처리로 전환하면서 다단계 트랜잭션 문제에 직면했다.특히, 사용자의 상태를 비활성화하고 관련 데이터를 삭제(논리 삭제)하는 과정에서 Spring Bean 간 순환참조가 발생했고, 이 문제를 해결하기 위해 SAGA 패턴의 Orchestration 방식을 도입하게 되었다.문제 상황: 순환참조와 트랜잭션의 한계사용자 비활성화는 다음과 같은 순서로 처리해야 한다.사용자가 업로드한 변환 이력 삭제 → ConversionService사용자의 인증 토큰 삭제 → TokenServiceKeycloak에서 사용자를 비활성화 처리 → UserService모든 단계는 @Transactional로 감싸..