-
프로그래머스 - 표현 가능한 이진트리
필요지식 이진트리 트리순회 문제 설명 해당 수를 이진트리로 표현할 수 있으면 1 없으면 0을 출력하는 문제이다. 주어진 문제 예시를 보면 주어진 이진트리에 더미노드를 추가하여 포화 이진트리를 형성한다. 즉, 이 것을 이용해 이진트리로 만들 수 있는지 없는지를 판별하면 된다. 문제에는 포화이진트리를 만들수 있는지 없는지 이렇게 물어보지 않고 있다. numbers 에 주어진 순서대로 하나의 이진트리로 해당 수를 표현할 수 있다면 1을, 표현할 수 없다면 0 이진트리에 속해있는 것이 포화이진트리이다. - 이진트리는 자식노드가 최대 2개인 트리이다. - 포화이진트리는 이진트리이면서 모든 레벨이 노드로 꽉 차 있어야 한다. 그렇기 때문에 이 문제는 해당 수를 이진수로 표현하고 포화이진트리로 형태로 만들면서 이것이..
프로그래머스
2023.04.11
-
제네릭 타입의 컴파일 영향
사전학습 : Generic , 배열과 제네릭의 차이 Generic 재너릭이라는 용어는 포괄적인 이라는 뜻으로, 클래스 내부에 사용할 데이터 타입을 외부에서 지정하는 기법을 의미한다. 다이아몬드 표기법을 사용한다. (ex. ) 특징 같은 구조를 갖는 코드의 중복을 줄일 수 있다. 타입 안정성이 보장된다.(컴파일시 타입 체크가 가능하다) 타입 제한도 가능(extends, implement) 참조 타입(Wrapper Class)만 사용이 가능하다. 메소드 적용이 가능하다. 재너릭과 배열의 차이 1)재너릭은 불 공변, 배열은 공변 이다. 공변 = "자기 자신과 자식" 객체로 타입 변환을 허용해주는 것. 불 공변 ="자기 자신" 을 제외한 타입 변환이 허용되지 않는 것. __ 제너릭의 타입 안정성이 보장되는 원리..
JAVA
2021.04.10
-
스프링 부트 Tranactional(readonly=true) 가 안되는 경우 || option이 안될 경우
>> @Transactional(readOnly = true) readOnly 에서 cannot resolve method..라는 문구가 뜨면서 오류가 나타났다.... soup.... 두가지 import 하는 과정에서 자동으로 2가지 중 아무거나 오는 경우가 있으므로... 조심해야 한다. Transactional 어노테이션의 기능을 제공하는 라이브러리는 2가지가 있다. 1. org.springframework.transaction.annotation.Transactional --> 옵션을 허용(readonly=true? false) 가능 2. javax.transaction.Transactional --> 옵션을 허용하지 않음..
spring Issue
2021.02.02
-
피보나치 수 3 <백준 2749번 문제>
문제 출처: https://www.acmicpc.net/problem/2749 ※공식※ 피보나치 수를 나눌 수를 K라고 할 때, 이면, 피사노 주기는 2749번 문제의 출력 조건은 “n번째 피보나치 수를 1,000,000으로 나눈 나머지를 출력합니다." 인데, 피보나치 수를 나눈 나머지들은 반드시 주기를 가지며, 이를 피사노 주기라고 한다는 사실을 알게 되었다.1 2 위 내용을 참고해 2749번 문제를 풀면서 사용한 정의는 다음과 같습니다. 피보나치 수를 나눌 수를 K라고 할 때, k=10^n 이면, 피사노 주기는 15∗10^n−1이다. 문제에서 106106 으로 나눈 나머지를 구하라고 했으므로 주기는 1,500,000 이 된다는 것을 알 수 있습니다. 따라서 입력의 최대값이 1,000,000,000,0..
Algorithm
2020.11.11
-
프로그래머스
2023.06.09
백준 - 파일 합치기3
문제 설명 파일을 모두 하나의 파일로 합치려고 한다. 단 파일을 합치는데 비용이 발생한다. a,b두개를 선택하여 합치면 각 값의 합으로 비용을 산정한다. 파일을 합칠 때 발생하는 최소비용을 구하는 문제이다. 주의사항 두 파일의 대한 값이 k개 백만개이고 각 요소의 최댓값은 만이다. 각 요소의 합이 백억까지될 수 있으므로 int자료형은 21억이라 overflow가 발생하니 타입에 주의해야 한다. 해당 문제에서 합치는 비용을 최소로 만들기 위해 작은 값끼리 먼저 더해가야 한다. 왜냐하면 이미 비싼 비용을 가진 파일이 점차 누적되기 때문에 큰 값은 계속 누적해서 더해가기 때문에 최소가 될 수 없다. 풀이 import java.util.Arrays; import java.util.PriorityQueue; im..
-
프로그래머스
2023.06.08
프로그래머스 - 과제 수행하기
문제 설명 과제를 진행하려 한다. 과제를 하던중 새로운 과제가 나오면 새로운 과제를 먼저 해야한다. 과제를 끝냈을 때, 잠시 멈춘 과제가 있다면, 멈춘 과제를 진행한다. 또한 멈춘 과제를 진행 중 새로운 과제가 출현하였을 때 새로운 과제를 먼저 해야한다. 그리고 멈춘 과제가 여러개일 경우 최근 멈춘 과제를 먼저 진행한다. 주의사항 과제는 시간순으로 정렬된 상태가 아니므로 정렬한다. 과제를 진행하고 다음 과제 출현 시간 사이에 자투리 시간이 있다면 멈춘과제를 수행해야한다. 즉, 멈춘 과제들을 모두 나중에 처리하는 것이 아님을 인지해야 한다. 여기서의 핵심은 자투리 시간의 과제를 수행해야 한다. 풀이 class Node{ String name; String startTime; int playTime; pub..
-
프로그래머스
2023.06.07
프로그래머스 - 요격 시스템
문제 설명 A나라가 B를 침략하기 위해 [s,e]까지 피해를 줄 수있는 미사일을 발포한다. B나라는 이 사실을 알고 A나라에서 발포한 미사일을 모두 격추 시키려 할 때, 최소한의 개수로 미사일을 격파시킬 수 있는 개수를 구하는 문제이다. 해당 문제는 한 점에서 최대 격추시킬 수 있는 미사일의 개수를 구하는 것이 핵심이다. 풀이 public int solution(int[][] targets) { Arrays.sort(targets,(a,b)-> { if(a[0] == b[0]){ return a[1]-b[1]; } return a[0] - b[0]; }); int answer=1; int end=targets[0][1]; for(int i=1; i
-
백준
2023.05.27
백준 - 우체국
문제 설명 각 마을들이 위치한 수직선 상에서 마을에 거주하는 각 사람들까지의 거리의 합이 최소가 되는 곳에 우체국을 건설하려고 할 때, 우체국을 세울 위치를 구하는 문제이다. 각 사람들까지의 거리의 합이 최소가 되는 곳에 우체국을 건설해야 하니 과반수가 넘는 인원에 대해서 최대한 가깝게 우체국을 건설하는 것이 좋다고 판단하였다. 우선 거리기반(오름차순), 인구수 기반(내림차순)으로 정렬한다. 하나씩 순회하면서 거쳐간 인원 인구수를 파악한 후 과반수 이상의 사람이 살고 있는 경우라면 해당 위치에 우체국을 건설한다. 단 원소의 값이 최소 + - 10억이므로 거쳐간 인구수에서 int 자료형은 이슈가 될 수 있으니 주의해야한다. 풀이 public static void main (String[] args) thr..
-
백준
2023.05.26
백준 - 꿀 따기
문제 설명 주어진 배열은 각 꿀의 양을 나타낸다. 벌 2마리 벌통 1개가 주어진다. 벌 2마리를 어느 위치에 위치시키고, 벌통을 벌2마리의 위치가 아닌 위치에 두면, 벌들이 벌통을 향해서 이동하게 된다. 단, 가는 길의 꿀을 따면서 간다. 이런 시스템으로 이동할 경우 벌들이 꿀을 딸 수 있는 가능한 최대 양을 구하는 문제이다. 처음 접근할 때 어떤 것을 고정시켜야 될까? 라는 질문에 답하지 못했다. 너무나도 애매했다. 왜냐하면 벌들의 위치와 꿀통의 위치에 따라 달라지는데, n^3 이 나온다고 생각했다. - 벌1,2 위치 선택 (n^2) - > 꿀통 위치 [i, n-1] (n) 그래서 시간초과가 분명하게 난다고 생각했다. 최대가 되는 경우를 생각해 볼때, “꿀벌 1 위치 < 꿀벌 2위치 시간초과 // 누적..
-
백준
2023.05.23
백준 - 항구
문제 설명 모든 화물을 크레인을 통해 옮기려고 한다. 크레인으로 모든 화물을 옮기는데 걸리는 최소 시간을 구하는 문제이다., 각 크레인은 최대로 화물을 올릴 수 있는 크기가 정해져 있다. 제한 범위 크레인의 총 개수 50 화물의 개수 10,000 가장 큰 화물을 들 수 있는 크레인이 가장 큰 적재화물을 드는 식이 최선이라고 생각했다. 크레인을 내림차순 적재 화물을 내림차순 주의사항 적재화물을 처음에 우선순위 큐로 소비하는 식으로 구현했다. 하지만 반례케이스가 존재했다. 크레인 = [10,8,1] 적재화물 = [10,8,7,1,1] - 단 2번 만에 옮김 수 있는 경우인데 적재화물 머리(7) 일 때, 다음 화물 1에서 크레인 1을 사용하여 옮길 수 있어 10,8,1을 걸리는데 1분이 걸리고 그다음 7,1,..
-
백준
2023.05.09
백준 - 톱니바퀴
문제 설명 톱니바퀴 4개가 주어진다. 톱니바퀴 하나를 회전화면 주의에 톱니바퀴가 돌아가게 된다. 주의의 톱니바퀴가 돌아가는 조건은 서로 맞물려있는 부분이 서로 다른 성질을 가지면 된다. 주어진 명령에 의해 해당 톱니바퀴를 돌리고 주어진 점수를 할당하여 점수를 구하는 문제이다. 1번 톱니바퀴의 12시방향이 N극이면 0점, S극이면 1점 2번 톱니바퀴의 12시방향이 N극이면 0점, S극이면 2점 3번 톱니바퀴의 12시방향이 N극이면 0점, S극이면 4점 4번 톱니바퀴의 12시방향이 N극이면 0점, S극이면 8점 풀이 맞물려있는 부분은 배열의 2번째 칸 6번째 칸이다. 하지만 맨 끝에 위치한 톱니바퀴는 왼쪽 또는 오른쪽에 아무것도 없다. 해당 문제에서 중요한 것은 전파이다. 전파력이 어디까지 도달할 수 있는지..
-
백준
2023.05.04
백준 - 철로
문제 설명 n명의 각 사람의 사무실 위치와 집 위치가 주어진다. 임이의 두점 A,B를 잊는 철로를 만들 떄 선분에 포함되는 사람의 수가 가장 많은 값을 출력하는 문제이다. 임의의 선분 L을 A=10, B=40일 때 4명의 사람이 포함되어 최댓값은 4가 된다. 풀이
-
백준
2023.05.02
백준 - 순회강연
문제 설명 강연날짜를 잡아 최대 수익을 얻을 수 있을 값은 무엇인지 구하는 문제이다. 단, 강연은 하루에 한번만 가능하다. 풀이 우선순위에 이익이 큰 순서대로 담고 현재 마감일자를 기준으로 강의를 담아낼 수 있는지 체크한다. 마지막 날짜에 최대한 큰 이익을 낼 수 있는 강의를 하는 것이 최대 수익을 얻을 수 있다. 만약 같은 데드라인을 가지게 되고 2번쨰로 큰 수익구조를 가지고 있다면 데드라인 -1 을 하며 강연이 비어있는 곳을 찾아낸다. 수익구조가 많으면 최대한 마감날까지 Lazy하게 미뤄야 최대 수익 구조를 가질 수 있게 된다. static class Node implements Comparable{ int profit,deadLine; public Node(int profit, int deadLin..
-
백준
2023.04.30
백준 - 문제집
문제 설명 가장 쉬운 문제부터 풀수 있는 과정을 출력하는 문제이다. 단, 문제마다 먼저 풀어야 하는 문제를 모두 풀어야 다음 문제를 풀어야 한다. 주의사항 문제는 난이도 순서로 출제되어 있다. 즉 1번 문제가 가장 쉬운 문제이고 N번 문제가 가장 어려운 문제가 된다. 이점을 생각하면 낮은 번호의 문제부터 풀어야 하므로 일반 큐가 아닌 우선순위 큐를 이용해야 한다. 풀이 public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(reader.read..
-
백준
2023.04.29
백준 - 가운데를 말해요
문제 설명 숫자를 입력 받을 때마다 중앙에 위치한 값을 출력하는 문제이다. min, max Heap 을 이용한다. maxHeap에는 작은 수를 min힙에는 큰 수를 넣어준다. (이름과 반대로 된 value들을 집어넣어준다.) 이렇게 minHeap에는 큰 값이 뒤로 밀려나고 maxHeap에는 작은값이 뒤로 밀리게 되면서 중앙값을 minHeap의 머리 또는 maxHeap 머리에 위치하게 된다. 그러면 이제 두 힙중에 어떤게 중앙값인지 선별해야 한다. 두 heap size()를 고르게 분포하기 위해 같은 Heap 사이즈를 갇는다면 max힙으로 몰아준다.(min으로 몰아줘도 상관없음) maxHeap이 더많다면 minHeap으로 이동한다. 이렇게 되면 maxHeap으로 이동한 혹시모를 큰수가 maxHeap에 머리..
-
프로그래머스
2023.04.25
프로그래머스 - 방의 개수
문제 설명 8가지의 방향 수가 입력으로 주어지고, (0,0)에서 출발하여 방향대로 움직여서 도형을 이루는 개수를 출력하는 문제이다. 도형이 만들어지는 경우는 해당 정점에 이미 다른 노드로부터 방문한 흔적이 있고 새로운 간선이 만들어지는 경우가 도형이 만들어지는 경우이다. (:= 사이클 형성) 주의사항 도형이 만들어지는 경우 엣지케이스가 존재한다. 교차점이 생성될 경우 이러면 도형은 위 아래 삼각형이 만들어지게 되는데 도형이 2개인지 1개인지 판별할 수 없게 된다. 맨 왼쪽 그림에서 해당 a로 다시 들어올때 방문했던 이력이 있고, 새로운 간선이 생겨 도형이 만들어졌다. 하지만 도형이 2개가 만들어 졌는지 1개가 만들어졌는지 알수 없다. 그래서 2배로 확대해서 보면 쉽게 2개가 만들어졌는지 1개가 만들어 졌..