전체 글 122

<java> 백준 11834 - 이진탐색

https://www.acmicpc.net/problem/11834 이 문제는 이진 탐색을 가장한 수학 문제이다.  일단 배열을 나열해 보면마지막 숫자들이 속한 그룹(n)의 제곱임을 알 수있다. 또한 그룹 내부에서도자신 그룹의 첫번째 숫자를 1 이라고 할때 2씩 커지기 때문에이전그룹의 마지막 숫자에서 현재 그룹에서의 index를 구해서2*index -1을 해주면 문제를 풀 수 있다. 해당 풀이를 식으로 구현해 보면 (I는 입력받은 숫자이다.)답이 2*I -n으로 간단하게 나온다 단 I가 10의 100승으로 아주 크기 때문에모든 숫자는 BigInteger로 처리해 주어야 하고n을 구할때도 이진 탐색으로 구현하여 시간을 최대한 줄여주어야 한다.정답import java.io.*;import java.math...

알고리즘/java 2024.06.10

<java> 이분탐색 사용

이분 탐색이분탐색 원리 오른차순 또는 내림차순으로 정렬된 배열에 적용 가능한 탐색 기법정렬된 배열에서 특정 값을 찾을때 정 중앙에 위치한 값을 활용하면 빠른 속도로 탐색을 끝낼수 있다.   이분 탐색 알고리즘시간복잡도: O(logN)반복문과 재귀 두 가지 방법을 사용할 수 있다.자료를 오름차순으로 정렬한다.자료의 중간값(mid)이 찾고자 하는 값(target)인지 비교한다.mid 값이 target과 다르다면 대소관계를 비교하여 탐색 범위를 좁히고, target과 mid 값이 같을 때까지 아래 조건에 따라 2번과 3번을 반복한다.          ⓐ target이 mid 값 보다 작으면 end를 mid 왼쪽 값으로 바꿔준다. (절반의 왼쪽 탐색)          ⓑ target이 mid 값 보다 크면 st..

알고리즘/java 2024.06.08

<java> hashCode

해시코드(hashCode)란?  해시코드란 객체를 식별하는 정수값입니다. Java에서 모든 객체는 `Object` 클래스의 `hashCode()` 메서드를 통해 자신만의 해시코드를 반환할 수 있습니다. 이 해시코드는 다음과 같은 특징을 가집니다: 1. 고유성(Uniqueness): 서로 다른 객체는 서로 다른 해시코드를 가져야 합니다. 2. 동일성(Equality): 동일한 객체는 항상 같은 해시코드를 반환해야 합니다. 3. 계산 효율성: 해시코드 계산은 빠르고 효율적이어야 합니다. 4. 균등 분포: 해시코드 값은 가능한 한 균등하게 분포되어야 합니다. 해시코드와 해시 테이블해시코드의 진가는 해시 테이블(Hash Table) 자료구조에서 발휘됩니다. Java의 `HashMap`과 `HashSet`은 내부..

알고리즘/java 2024.06.07

<java> stack 대신 deque

stack?"쌓다"라는 의미로 데이터를 하나씩 쌓아 올린 형태의 자료 구조,한쪽 끝에서만 자료를 넣고 뺄수 있는 후입선출 LIFO(Last in First Out) 형식의 자료구조 이다. stack을 지양하는 이유 1. interface의 유연성java에서는 다중상속을 지원하지 않으며stack은 클래스 이므로 확장이 불가능 하다 반면 deque은 인터페이스 이다.인터페이스는 클래스 상속보다 더욱 유연하기 때문에이미 상속을 받은 클래스 더라도인터페이스를 구현할 수 잇다.  → 인터페이스인 deque이 클래스인 stack 보다 객체지향관점에서 더욱 많은 유연성을 지원 2. 동기화 메소드 및 성능Vector.class를 상속하여 사용→  thread safety 를 위한 전통적인 방법이며 단점 발생(threa..

알고리즘/java 2024.06.06

<java> ArrayDeque vs LinkedList

ArrayDeque vs LinkedListArrayDeque1. 내부구현배열을 기반으로 한 데크(Double-Ended Queue) 구현체크기를 동적으로 조절할 수 있어서 큐에 요소를 추가하거나 제거할 때 크기를 변경할 필요가 없다.2. 성능큐의 크기를 동적으로 조절할 수 있으므로, 큐의 앞 또는 뒤에서의 요소 추가 및 제거가 상수 시간(O(1)) 이다.3. 접근 시간배열을 사용하기 때문에 인덱스를 통한 빠른 접근이 가능하다.4. 메모리 사용각 요소는 배열에 저장되므로 메모리 사용이 연속적이다.고정된 크기의 배열을 사용하는 것이 아니라 동적으로 크기가 조절되므로 메모리 사용이 효율적이다.LinkedList1. 내부구현이중 연결 리스트를 기반으로 한 데크 구현체각 요소는 이전 요소와 다음 요소를 가리키는..

알고리즘/java 2024.06.06

<java> 세그먼트 트리 segment tree

세그먼트 트리여러 개의 데이터가 연속적으로 존재할 때 특정한 범위의 데이터의 합을 구하는 방법특정 구간의 합을 가장 빠르게 구하는법 1. 기존방식순서대로 하나씩 들고와서 더하기 → 시간복잡도 O(N) 2. 트리구조로 구하기세그먼티 트리 초기화 및 생성 함수arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]tree = [0] * (len(arr) * 4)​ 세그먼트 트리의 크기는 배열의 개수 N일 때,N보다 큰 가장 가까운 N의 제곱수를 구해 그것의 2배를 하여 미리 크기 구하기→  실제로는 데이터의 개수 N에 4를 곱한 크기만큼 미리 세그먼트 트리의 크기 할당  왼쪽 자식 노드의 번호는 2번이 되며, 0~4까지의 arr 구간 합의 값이 삽입된다.오른쪽 자식 노드의 번호는 3번이 되며, 5..

알고리즘/java 2024.06.04

<spring> LocalDateTime 역직렬화(deserialization)

역직렬화역직렬화(Deserialization)는 데이터 구조나 객체 상태를 저장한 파일 또는 데이터에서 복원하는 과정네트워크를 통해 전송되거나 파일에 저장된 바이트 스트림을 원래의 객체로 변환역직렬화의 중요성애플리케이션 간에 안전하게 전송,저장시 필수적데이터를 전송할 때 JSON, XML 등의 형식으로 직렬화하여 전송하고, 클라이언트에서는 이 데이터를 받아 역직렬화하여 사용역직렬화의 위험성데이터 코드 내에서 객체로 변환 시, 역직렬화 과정을 통해 시스템 내부에서 에러 발생 가능역직렬화 방지 전략입력 데이터의 검증, 신뢰할 수 있는 데이터만 역직렬화 처리역직렬화 과정에서 발생할 수 있는 예외를 적절히 처리문제 상황LocalDateTime 객체를 JSON 형식으로 변환할 때,표준 JSON 라이브러리는 Loc..

카테고리 없음 2024.06.01

<spring> cache 적용

캐시(Cache)데이터 또는 문서의 복사본을 임시 저장하는 장소로 빠르게 접근 가능자주 사용되거나 반복적으로 요청되는 데이터를 빠르게 로드 → 사용자 경험 향상, 서버 부하 캐시의 종류브라우저 캐시: 사용자의 브라우저에 데이터를 저장서버캐시: 서버 측에서 데이터를 저장분산캐시: 여러 서버에 걸쳐 데이터를 저장Redis와 캐싱Redis고성능 키-값 저장소로 널리 사용되는 분산 캐시 시스템메모리 내 데이터 저장과 빠른 읽기/쓰기 작업을 지원Redis를 사용한 캐싱의 장점속도: 메모리에 데이터 저장 → DB조회보다 빠름경제성: 자원사용 줄임확장성: 네트워크 통해 접근 가능 → 여러 서버에서 데이터 공유 가능@Cacheable 을 통해서 사용@Cacheable(cacheNames = "Best30")public..

web 개발/spring 2024.06.01

<java> map 의 사용

Key, value 값으로 이루어진 Collector 이다 key는 중복 될 수 없다. stream 을 사용한 작성words.stream() .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())) map의 stream 사용entrySet을 빼서 사용map.entrySet().stream().filter(i -> i.getValue() == n)//개수 같은거만 filter .map(Map.Entry::getKey)//키만 빼서 .sorted() .collect(Collectors.toList());//정렬 map의 sort일반적으로 안되지만 stream 은 가능map.entrySet().stream() ..

알고리즘/java 2024.06.01

<java>백준 4374 - map

https://www.acmicpc.net/problem/4374\ 틀렸습니다를 보고 들어온 사람들을 위한 간단 tip글자 쪼개기 단위는 빈칸이 아닙니다. a-z가 아닌 모든 글자에요! static String reg = "[\\W_]+";이걸로 시간 뺏기신 모든 분들 응원합니다 ㅜㅜ   최근 올라온 지 얼마 안된 것 같은 문제들을 조금씩 도전하고 있는데java풀이가 하나도 없는 문제는 처음 인것 같다.사실 입출력에 관한 문제 이니 크게 문제 설명할 것은 없는듯 하고한줄 씩입력 받아서 쪼개고 다시 넣어서입력 된 숫자 빈도에 맞는 글자들만 다시 return 하면 되는 방식 이다. 요즘 stream 사용을 열심히 공부하는 중이기 때문에stream 위주로 보면 좋을 것 같다. import java.io...

알고리즘/java 2024.05.31