Loading...
2023. 5. 22. 11:04

코딩테스트 복기 - 배열에서 특정 수보다 작은 수 중 가장 가까운 수를 찾는 방법(find nearest element than smaller one on the left side)

1. 문제 배열이 주어질때, 특정한 수보다 작으면서 가장 가까운 수를 찾고자 한다. 예를 들어 [3,1,2,10,5,6,4]가 주어질때, 10보다 작으면서 가까운 수는 바로 옆에 2와 5가 있다 이 경우 인덱스가 더 작은 2를 출력하고 싶고 1의 경우는 만족하는 원소가 없으므로 -1을 출력한다. 2. 풀이 - 왼쪽에서 더 작은 원소의 위치를 찾기 생각보다 어렵던데..? 그냥 많이 어려운데 적어도 생각나는건 $O(N^{2})$ 브루트 포스뿐.. 하지만 n이 10만이 넘어가는데 브루트 포스가 통과할리는 없을 것 같고 스택을 이용해서 O(N)에 효율적으로 풀 수 있다고 한다 알고리즘을 보면 의외로 간단하네.. 생각하기가 어렵지 일단 A의 i번째 원소에 대해 왼쪽에서 작으면서 가장 가까운 원소를 찾는다 그래서 ..

반복문으로 구현하는 세그먼트 트리(iterative segment tree) 배우기

1. 반복문으로 구현하는 세그먼트 트리 세그먼트 트리 기본 버전은 재귀함수로 구현되어 있다 import math def create_segment(A,tree,tree_index,start,end): if start == end: tree[tree_index] = A[start] else: mid = (start+end)//2 create_segment(A,tree,2*tree_index,start,mid) create_segment(A,tree,2*tree_index+1,mid+1,end) tree[tree_index] = tree[2*tree_index] + tree[2*tree_index+1] def query_sum(tree,tree_index,start,end,left,right): if lef..

2023. 4. 3. 00:41

자바 HashMap - 개발자가 정의한 class를 key로 만드는 방법

자바의 HashMap은 파이썬의 dict처럼, 고유한 key와 대응하는 value를 하나의 쌍으로 하여, 저장하는 자료구조 일반적으로 key를 문자열, 정수값으로 사용하지만, 필요에 따라 특정한 class를 key로 하고 싶을 수 있다 시험에 아래와 같은 Point라는 클래스를 key로 하고 싶었는데... class Point { int x,y; public Point(int x, int y) { this.x = x; this.y = y; } } 이걸 HashMap의 key로 사용해서 자료를 관리해볼려 했는데.. 원하는대로 동작을 안하더라고? 그립습니다 파이썬님 자연스럽게 두 객체 p1, p가 같다는 것은 x,y가 서로 같다는 것인데.. 문제는 key로 사용한 p1의 주소와 get을 하면서 넣은 p의 주..

2023. 3. 27. 02:55

[Java]HashMap 응용력 키우기2 -두 수의 합과 세 수의 합 그리고 네 수의 합-

1. 문제 n개의 정수가 입력으로 주어지고, 이 중 서로 다른 위치에 있는 두 개의 수를 뽑아 더했을 때 k가 되는 가짓수를 구하는 프로그램을 작성해보세요. 2. 풀이 가장 쉬운 방법은 $O(N^{2})$으로 해결하는 것이다. 배열에 N개의 정수를 모두 저장하고, 2중 for문을 돌아서 모든 쌍을 검사해서 합이 k가 되는지 검사해보는 것이다 하지만 N의 제한이 최대 10만이라면? 당연히 $O(N^{2})$의 알고리즘을 요구하는 문제는 아닐 것이다 합이 k가 되는 두 원소는 어떻게 선택할 수 있을까? 배열에서 한 원소를 골랐을때, 다른 원소는 무조건 k - (이전에 고른 원소)를 골라야할 것이다. 그러므로, HashMap에 배열의 모든 원소의 정보를 저장해두고, 배열에서 한 원소를 고르는 작업을 O(N)에..

[Java]자바 HashMap 문제 풀면서 HashMap 이해력 높이기 1편

1. 매우 큰 범위의 배열이 필요할때 서로 다른 6개의 숫자가 주어진 뒤 끝에 숫자 k가 주어졌을 때, 숫자 k가 몇 번째로 주어졌는지를 판단하는 프로그램을 작성해보세요. 단, 주어지는 숫자의 범위는 -10^9 ~ 10^9 사이입니다. 예를 들어 [-656, 234, 65756344, 7678678, 123123, 567567567] 에서 k가 65756344라면, 3번째로 주어진 숫자이므로 답은 3이 됩니다. 이런 경우 -10^9에서 10^9을 모두 담는 배열을 선언하기에는 메모리가 부족하다 하지만 필요한 숫자는 6개밖에 안된다. 그래서 이럴때 필요한 자료구조가 HashMap HashMap은 (key,value)형태로 데이터를 저장하며, key의 범위는 정의하기 나름이고, 사용되는 메모리 공간이 전체 ..

[Java]우선순위 큐 응용 - MN개의 조합에서 조건을 만족하는 k번째 수를 찾는 빠르게 찾는 방법 1편

1. 문제 n개의 숫자로 이루어진 수열과 m개의 숫자로 이루어진 수열이 주어졌을 때, 각 수열에서 정확히 원소를 하나씩만 뽑아 나올 수 있는 모든 쌍들을 모두 구하고, 그 값들을 오름차순이 되도록 나열했을 때의 k번째 쌍의 두 수의 합을 구하는 프로그램을 작성해보세요. n,m은 1이상 10만 이하의 자연수 k는 1이상 min(nm, 10만)이하 2. 풀이 가장 쉽게 생각할 수 있는 방법은 mn개의 모든 조합을 만든 다음에 우선순위 큐에 모두 집어 넣고, k번째 빠지는 수를 출력하면 된다 근데 뭐 당연히 시간초과 + 메모리 초과임 m과 n이 10만인데 시간복잡도가 얼마냐 이거 O(M + N + MNlogMN + KlogMN)인가..? 아무튼 O(MN)으로 생각하는 순간 10만*10만 = 100억으로 오바다..