본문 바로가기

Algorithm

n^2 배열 자르기 n*n배열을 주어진 left, right 인덱스 범위로 1차원 배열만들기 ex: n = 3, left = 2, right = 5 123 223 333 -> 3,2,2,3 처음에는 단순히 배열을 만들어서 인덱스를 자르려고 함 for(int i=0; i-0; j--){ arr[j][i] = i+1; arr[i][j] = i+1; } } 하지만 제한사항으로 인하여 불가능.... 1 ≤ n ≤ 10^7 0 ≤ left ≤ right < n^2 right - left < 10^5 해결방안 1. 2차원 배열의 값은 좌표 x,y의 max값 + 1로 구성된다. 값 (x, y) 1 (0,0) 2 (0,1) 3 (0,2) 2 (1,0) 2 (1,1) 3 (1,2) 2. 인덱스(left ~ right)의 좌표 x,y를 알 .. 더보기
메뉴 리뉴얼 주문한 메뉴에 따라 코스메뉴로 만드는 문제 조건 최소 2가지 이상 단품이 있어야한다. 단품은 2명 이상 주문을 해야한다. 조합을 해준 다음에 map을 사용하여 key로 메뉴, value로 주문 카운트를 넣어서 sort 하여 비교한다. import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; class Solution { private Ha.. 더보기
[1차] 프렌즈4블록 2x2일 경우 프렌즈 블록이 지워지고, 아래로 떨어진다. 터진 블록의 갯수 조건 2 ≦ n, m ≦ 30 2x2일 경우 터진다. 중복 계산 가능 A~Z(대문자)로 입력이 주어짐 2x2 블록을 찾기위해 탐색을 해주고, 터질 위치를 새로운 배열을 만들어 체크해준다. 그후 블록을 제거해준다.(미리 제거하면 중복 계산 가능 조건에 어긋남) 반복 0 ~ m-1 // m++ 반복 n-1 ~ 0 // n-- 열기준으로 (n-1,0)부터 (0,m-1) 탐색을 해준다. 공백이 있는 경우 index를 기준으로 위로 다시 반복 탐색 class Point { public int x, y; public Point(int x, int y) { this.x = x; this.y = y; } } int[][] visit; int[].. 더보기
[1차] 캐시 도시 이름을 캐시 기능을 사용하여 조회할 수 있도록 조건 LRU 알고리즘 hit == 1ch miss == 5ch 문제풀이 캐시로 사용할 vector를 선언하고, 반복을 돌때마다 순위를 정렬하여, 오래된 순위를 제거하기 hit시 : hit한 캐시vector의 index값 보다 작은 index들을 +1 증가 후, 순위를 1로 하여 삽입 miss시 : 캐시vector의 size를 체크 size가 full일 경우 : 오래된 순위(반복시 정렬하기 때문에 마지막 index 제거) 캐시vector 전체의 순위를 +1 증가 후, 순위를 1로 하여 삽입 #include #include #include #include using namespace std; using namespace std; struct point { .. 더보기
게임 맵 최단거리 조건 1. 사용자는 무조건 map의 1,1에 위치하고, 상대팀 진영은 n,m에 위치한다. 2. 동서남북만 이동할 수 있고, 벽은 0, 갈수 있는길은 1이다. 전형적인 최단거리 탐색 최소값을 찾기 위하여 시간을 줄이기 위하여 bfs로 탐색하였다. 문제풀이 : BFS로 최단거리 탐색 import java.util.LinkedList; import java.util.Queue; public class Bfs { private static int[] dx = {-1,0,1,0}; private static int[] dy = {0,1,0,-1}; public class Point{ int x; int y; int cnt; public Point(int x, int y, int cnt){ this.x = x; t.. 더보기
거리두기 확인하기 문제 조건 5X5 행렬 1. 거리두기 가능 조건 1-1. 맨허튼 거리(좌표 절대값 거리) > 2 1-2. 파티션은 막혀있다. -> BFS || DFS로 탐색을 하면 되겠다. -> 탐색을 할 때, 거리가 2 이상인 것은 조회할 필요가 없다. 2. 거리두기 -> 거리두기가 false인 상황에는 조회 할 필요가 없다. 문제 풀이 1. String 배열을 split("")를 이용하여 이차원 배열을 만듬 2. 체크를 위한 visit[][] 선언 및 초기화 3. 이차원 배열을 만들면서 ArrayList에 "P"의 x,y좌표와 cnt를 0으로 넣어준다. 4. P를 기준으로 BFS 탐색 4-1. 거리가 2 초과시 탐색 무시(continue) 4-2. 거리가 2 미만인데 "P"를 만날 경우 탐색 종료 (return fa.. 더보기