본문 바로가기
계단 오르기, 돌다리 건너기 DP : 1차원 배열인 다이나믹 테이블을 이용해서 점화식 형태로 나오는 문제의 값을 구한다 계단을 오를 때 한 번에 한 계단 또는 두 계단씩 올라간다. 만약 총 4계단을 오른다면 그 방법의 수는 1+1+1+1, 1+1+2, 1+2+1, 2+1+1, 2+2 로 5가지이다. 그렇다면 총 N계단일 때 올라갈 수 있는 방법의 수는 몇 가지인가? 계단을 오르는 방법을 저장하면서 푸는 문제 1번 계단 1가지, 2번 계단 2가지, 3번 계단 3가지... d[n] = d[n-1] + d[n-2] 형태 import java.util.*; class Main{ static int[] dy; public int Solution(int n){ dy[1] = 1; dy[2] = 2; for (int i = 3; i 2023. 9. 9.
1,2주차 데이터베이스 용어 데이터 - 값 데이터베이스 : 많은 정보를 저장, 정보 저장 공간 DBMS - 데이터베이스 관리 시스템, 메모리에 db를 적재, 권한, 실제 존재하는 운영 소프트웨어(학사시스템, 예약시스템) 데이터베이스 정의 조직 안에 저장,운영,공유,통합 4가지 데이터베이스 특징 실시간 접근 - 언제나 접근 가능 변화 - db내용을 삽입,삭제,수정을 하면서 정확한 데이터를 유지 동시 공유 - 동시에 접근 가능 내용 기반 참조 - db 내용, 값을 기반해서 참조 2023. 9. 8.
재귀, 정렬 알고리즘 하노이탑 def hanoi(n,fr,tmp,to): if n == 1: print("원반 1을 %s에서 %s로" %(fr, to)) else: #n-1개를 시작점에서 임시 지점으로 옮기기 hanoi(n-1,fr,to,tmp) #남은 1개를 목적지로 print("원판 %d를 %s에서 %s로"%(n,fr,to)) #임시 지점에 있는 n-1개를 목적지로 hanoi(n-1,tmp,fr,to) hanoi(4, 'A', 'B', 'C') 거듭제곱 def pow(x,n): if n == 0 : return 1; elif n % 2 == 0: return pow(x*x, n//2) else: return x*pow(x*x, (n-1)//2) print(pow(2,4)) print(pow(2,5)) 피보나치 순환 def.. 2023. 9. 8.
원더랜드(최소스패닝트리-프림) 도시를 연결하는 도로의 최소비용 찾기 도시의 개수 V와 도로의 개수 E가 주어진다 입력 9 12 1 2 12 1 9 25 2 3 10 2 8 17 2 9 8 3 4 18 3 7 55 4 5 44 5 6 60 5 7 38 7 8 35 8 9 15 출력 196 프림 알고리즘 - 우선순위 큐를 이용해서 푸는 방법 이번에는 유니온 파인드를 하지 않고 우선순위 큐를 이용한다 Edge 클래스에 현재 정점이어진 정점과 비용만 넣고(입력을 받을때 이중 ArrayList에 get(현재정점).add(new Edge(이어진정점, 비용)) 형태로 받기에 Edge 클래스를 만들때 이어진 정점을 넣는다 현재 정점과 이어진 정점들을 탐색한다 check 배열을 만들어서 이미 정점을 방문했는지를 판단한다 class Edge imple.. 2023. 9. 7.
원더랜드(최소스패닝트리-크루스칼) 도시를 연결하는 도로의 최소비용 찾기 도시의 개수 V와 도로의 개수 E가 주어진다 입력 9 12 1 2 12 1 9 25 2 3 10 2 8 17 2 9 8 3 4 18 3 7 55 4 5 44 5 6 60 5 7 38 7 8 35 8 9 15 출력 196 최소스패닝트리, 크루스칼 알고리즘 등등으로 부르고 내가 이해한건 시작노드, 끝나는 노드, 비용을 가지는 Edge 클래스를 만들어서 비용을 기준으로 오름차순으로 정렬한 arraylist에 edge를 넣고, 시작노드와 끝 노드가 연결됐는지를 유니온파인드로 판단해 노드를 연결한 집합을 만들면서 연결할때마다 비용을 저장해두는 걸로 이해했다 !유니온 파인드는 그냥 방법을 외우자 unf[] 2023. 9. 6.
친구인가(Disjoint-set: 유니온-파인드) 유니온 파인드 만드는건 외워두자 모든 학생은 1부터 N까지 번호가 부여되어 있고, 현수에게는 각각 두 명의 학생은 친구 관계가 번호로 표현된 숫자쌍이 주어진다. 만약 (1, 2), (2, 3), (3, 4)의 숫자쌍이 주어지면 1번 학생과 2번 학생이 친구이고, 2번 학생과 3번 학생이 친구, 3번 학생과 4번 학생이 친구이다. 그리고 1번 학생과 4번 학생은 2번과 3번을 통해서 친구관계가 된다. 학생의 친구관계를 나타내는 숫자쌍이 주어지면 특정 두 명이 친구인지를 판별하는 프로그램을 작성하세요. 두 학생이 친구이면 “YES"이고, 아니면 ”NO"를 출력한다. 첫 번째 줄에 반 학생수인 자연수 N(1 2023. 9. 6.
다익스트라자 알고리즘 가중치 방향그래프에서 1번 정점에서 모든 정점으로의 최소 거리비용을 출력하기, 경로가 없으면 impossible 출력 첫째 줄에는 정점의 수 N과 간선의 수 M가 주어진다. 그 다음부터 M줄에 걸쳐 연결정보와 거리비용이 주어진다. 입력 6 9 1 2 12 nowCost + ob.cost){ dis[ob.vex] = nowCost + ob.cost; //pq에 현재 정점과 연결된 정점의 비용을 기존 연결된 정점의 비용과 합쳐서 넣음 pq.offer(new Edge(ob.vex, ob.cost + nowCost)); } } } } 전체 코드 import java.util.*; class Edge implements Comparable{ int vex; //정점 int cost; //비용 Edge(int ve.. 2023. 9. 5.
최대 수입 스케쥴(우선순위 큐) N개이 기업에서 강연 요청을 해왔다. 각 기업은 D일 안에 와서 강연을 해 주면 M만큼의 강연료를 주기로 했다. 각 기업이 요청한 D와 M를 바탕으로 가장 많을 돈을 벌 수 있도록 강연 스케쥴을 짜야 한다. 입력 6 50 2 20 1 40 2 60 3 30 3 30 1 출력 150 우선순위 큐를 이용하는 문제, 아래처럼 int를 내림차순으로 저장하는 큐를 만들고 강연 날짜를 할수 있는 마지막 날부터 내림차순으로 정렬한 금액, 날짜 쌍의 금액을 넣는다. 마지막 날 부터 하는 이유 - 3일동안 강연할때 3일째에는 3일날에 하는 강연밖에 못함 -> 3일에 할수 있는 강연중 가장 큰 금액을 주는 강연, 2일날에는 3일에 할수있는 강연과 2일에 할수 있는 강연 중 가장 큰 금액을 주는 강연... 처음에 입력받는 .. 2023. 9. 4.
결혼식 in.next().charat(0) 2023. 9. 4.
회의실 배정 좌표 정렬 잘 기억해두자 this - o 2023. 9. 4.
씨름 선수 좌표정렬 - implement Comparable, 구현하는 compareTo(obejct o) 메서드는 this - o 하면 오름차순, o - this 하면 내림차순, 만든 후 Collections.sort로 정렬하자 그리디 - 한 요소를 정렬 후 정렬되지 않은 요소에서 최선의 결과를 선택하는 방법?으로 이해했다 A라는 지원자를 다른 모든 지원자와 일대일 비교해서 키와 몸무게 모두 A지원자 보다 높은(크고, 무겁다) 지원자가 존재하면 A지원자는 탈락하고, 그렇지 않으면 선발된다. N명의 지원자가 주어지면 위의 선발원칙으로 최대 몇 명의 선수를 선발할 수 있는지 알아내는 프로그램을 작성하세요. 입력 5 172 67 183 65 180 70 170 72 181 60 출력 3 2중 for문 쓰면 n이 최대 .. 2023. 9. 4.
피자 배달 거리 !문제 다시 풀어보기 9/3.. 조합 만드는 방식은 외워두자.. 피자집 ArrayList, 집위치 ArrayList를 만들고 피자집 m개를 고른 조합을 만든다 각 집까지의 최소 배달 거리를 sum에 누적해서 가장 작은 경우가 나오는 조합일때 정답 보드를 만드는게 아니라 입력 받을 때 피자집인지 가정집인지 판단해서 ArrayList에 넣는다 DFS에서는 만든 조합으로 가정집을 각각 돌면서 한 가정집까지 가는 최소거리를 구하고 그걸 sum에 누적한다 전체 코드 import java.util.*; class point{ int x; int y; point(int x, int y){ this.x = x; this.y = y; } } class Main{ static int[] comb; //조합 저장용 배열 s.. 2023. 9. 3.
섬나라 아일랜드(BFS) 풀이에 Pointer 클래스를 사용한 것 이외에는 거의 비슷하다 import java.util.*; class Pointer{ int x; int y; Pointer(int x, int y){ this.x = x; this.y = y; } } class Main{ static int[] dx = {-1,0,1,0,-1,-1,1,1}; static int[] dy = {0,1,0,-1,-1,1,1,-1}; static int[][] board; static Queue Q = new LinkedList(); static int res = 0, n; public void Solution(){ for (int i = 0; i < n; i++){ for (int j = 0; j < n; j++){ if (boar.. 2023. 9. 3.
섬나라 아일랜드(DFS) N*N의 섬나라 아일랜드, 섬은 1, 바다는 0 섬은 상하좌우 + 대각선 8방향 섬이 몇개인지 구하는 문제, 그림은 섬이 5개 입력 7 1 1 0 0 0 1 0 0 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 1 1 1 1 0 1 1 0 0 1 0 0 0 1 0 0 1 0 1 0 1 0 0 출력 5 기존에 상하좌우 dx,dy배열에 대각선을 넣고 dfs로 섬을 판단하는 문제 Solution 함수로 보드 전체를 2중 for문을 돌면서 바다가 아닌 땅이 나오면 DFS 함수로 그 섬의 주변에도 갈수 있는 땅이 나오는지 판단한다 Solution 함수에서 땅을 발견하면 카운트를 늘려주고 DFS 함수를 호출, DFS함수가 주변이 전부 바다일때 까지 돌고 다시 Solution 함수로 돌아와서 이어서.. 2023. 9. 3.
토마토(BFS 활용) .토마토는 아래의 그림과 같이 격자 모양 상자의 칸에 하나씩 넣어서 창고에 보관한다. 창고에 보관되는 토마토들 중에는 잘 익은 것도 있지만, 아직 익지 않은 토마토들도 있을 수 있다. 보관 후 하루가 지나면, 익은 토마토들의 인접한 곳에 있는 익지 않은 토마토들은 익은 토마토의 영향을 받아 익게 된다. 하나의 토마토의 인접한 곳은 왼쪽, 오른쪽, 앞, 뒤 네 방향에 있는 토마토를 의미한다. 대각선 방향에 있는 토마토들에게는 영향을 주지 못하며, 토마토가 혼자 저절로 익는 경우는 없다고 가정한다. 현수는 창고에 보관된 토마토들이 며칠이 지나면 다 익게 되는지, 그 최소 일수를 알고 싶어 한다. 토마토를 창고에 보관하는 격자모양의 상자들의 크기와 익은 토마토들과 익지 않은 토마토들의 정보가 주어졌을 때, 며.. 2023. 9. 1.
미로의 최단거리(BFS) 뭔가 기존 자료형으로 안될거 같으면 클래스를 만들어서 사용해보자 7*7 격자판 미로를 탈출하는 최단경로의 길이를 출력 입력 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 1 0 0 0 1 1 0 1 0 1 1 1 1 0 1 0 0 0 1 0 0 0 1 0 0 1 0 1 0 0 0 0 출력. 도착할 수 없으면 -1를 출력한다. 12 풀이 한 지점에서 상하좌우 지점으로 이동하는 것을 레벨 탐색으로 생각하고 board 배열 이동 횟수를 저장할 dis 배열을 만든 후 이동할때마다 기존 배열의 이동횟수 +1을 하면서 레벨 탐색한다, 마지막에 dis[7][7] 칸이 0이면 마지막 칸 까지 도달한 방법이 없는거라 -1, 아니면 dis[7][7]의 값을 리턴한다 일단 좌표를 저장할 Pointer 클래스를.. 2023. 8. 31.
DFS 미로찾기 7*7 격자판 미로를 탈출하는 경로의 가지수를 출력하는 프로그램을 작성하세요. 출발점은 격자의 (1, 1) 좌표이고, 탈출 도착점은 (7, 7)좌표이다. 격자판의 1은 벽이고, 0은 통로이다. 격자판의 움직임은 상하좌우로만 움직인다. 미로가 다음과 같다면 입력 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 1 0 0 0 1 1 0 1 0 1 1 1 1 0 0 0 0 1 1 1 0 1 1 0 0 1 0 0 0 0 0 0 출력 8 DFS로 dx,dy배열을 순회하면서 갈수 있는 칸이면 가고 간 칸은 체크, 갔다가 돌아오면서 체크 해제 하는 방법으로 푼다 DFS 함수 내부에서는 갈수 있는 칸인지 판별하기 위해서 범위를 확인하고 넘어간다 import java.util.Scanner; public c.. 2023. 8. 31.
자바로 만들기 단축키 - 설정 keymap에서 볼수 있음 alt + insert로 generate 해서 생성자,get,set 등 쉽게 만들 수 있음 ctrl + alt + v - 타입?을 알아서 만들어줌 psvm - public static void main메인 함수 만들때 psvm 치고 엔터누르면 바로 생성 ctrl + shift + t dip 위반 이렇게 기능을 확장해서 변경하면 클라이언트 코드에도 영향을 준다 -> ocp 위반 문제 해결하기 dip 위반하는걸 추상(인터페이스)에만 의존하게 의존관계를 변경하면 된다 private DiscountPolicy discountPolicy; 2023. 8. 31.
iterator, Listiterator List 컬렉션 클래스에서만 Listiterator를 사용 가능하다 LinkedList l = new LinkedList(); 로 이중연결리스트를 만들고 나서 ListIterator it = l.listIterator();를 선언해서 위의 Linkedlist를 순회하는 Listiterator를 사용할 수 있다..hasNext(), .hasPrevious(), .hasNext() - 앞이나 뒤에 요소가 있는지 확인 .next(), .previous() - 이동하면서 값을 반환 remove - 현재 it 위치에 있는 요소를 제거, add(E) - 현재 it 위치에 E를 추가 2023. 8. 27.
LinkedList(이중 연결 리스트) https://www.codetree.ai/missions/6/problems/integer-command-processing-8?&utm_source=clipboard&utm_medium=text LinkedList l = new LinkedList(); 형태로 이중연결리스트 사용 addFirst(E) - 맨 앞에 데이터 E를 추가 addLast(E) - 맨 뒤에 데이터 E를 추가 pollFirst() - 맨 앞에 있는 데이터를 반환하면서 리스트에서 삭제 pollLast() - 맨 뒤에 있는 데이터를 반환하며서 리스트에서 삭제 size() - 현재 list에 들어있는 데이터의 수 isEmpty() - 현재 list가 비어있다면 true, 아니라면 false peekFirst() - list의 맨 앞에 .. 2023. 8. 27.