본문 바로가기

Algorithm221

[백준] 15989: 1, 2, 3 더하기 4 - JAVA https://www.acmicpc.net/problem/15989 풀이1만 써서 나타내는 방법은 1가지씩 가지고 있으므로 dp배열을 1로 초기화한다. 2가 추가되기 위해서는 i-2를 나타내는 방법들의 뒤에 2를 붙이면된다. 반복문을 통헤 `dp[i] += dp[i - 2]` 를 적용해준다. 마찬가지로 3을 추가하려면 i-3을 나타내는 방법에 3을 붙이면 된다. `dp[i] += dp[i - 3]` 을 적용한다.  메모리: 14304KB시간: 132ms언어: Java 11import java.util.*;import java.io.*;public class Main { public static void main(String[] args) throws Exception { Buffered.. 2024. 5. 17.
[백준] 20922: 겹치는 건 싫어 - JAVA https://www.acmicpc.net/problem/20922 풀이같은 원소가 K개 이하로 들어있는 최장 연속 부분 수열의 길이를 구해야한다. 원소의 개수를 세줄 배열을 만들어놓고 0부터 시작하여 원소의 개수를 세준다. i번째 원소의 개수가 K개보다 크다면 start부터 시작하여 i번쨰 원소와 같은 원소가 나올때까지 count 배열에서 하나씩 빼준다. `(i - start + 1)` 이 조건을 만족하는 부분 수열의 길이이다. 최댓값과 비교하여 갱신해준다.  메모리: 32740KB시간: 360ms언어: Java 11import java.util.*;import java.io.*;public class Main { public static void main(String[] args) throws .. 2024. 5. 17.
[백준] 2075: N번째 큰 수 - JAVA https://www.acmicpc.net/problem/2075 풀이N \* N 개의 숫자 중에 N번째로 큰 숫자를 찾아야 한다. 우선순위큐를 사용해 정렬방식을 내림차순으로 하여 N개만큼 뽑는 방법이 있다. 이때는 `Collections.reverseOrder()` 를 사용해야 한다. 나는 오름차순 우선순위큐의 사이즈를 N으로 유지시키면서 값을 집어넣고 마지막에 하나를 뽑기로 했다. 이렇게하면 가장 큰 수 N개가 우선순위큐에 들어있게 되고, poll하면 N번째로 큰 숫자가 나온다.  메모리: 244104KB시간: 944ms언어: Java 11import java.util.*;import java.io.*;public class Main { public static void main(String[].. 2024. 5. 17.
[백준] 11501: 주식 - JAVA https://www.acmicpc.net/problem/11501 풀이미래에 더 높은 주가가 나올 예정이라면 주식 하나를 샀다가 더 비싸게 파는것이 이득이다. 따라서, 주가를 저장해놓고 역순으로 탐색한다. 최댓값을 저장하면서 최댓값보다 크거나 같다면 최댓값을 갱신하고 최댓값보다 작다면 (최댓값 - 주가)를 이익에 더해준다.  메모리: 318056KB시간: 1084ms언어: Java 11import java.util.*;import java.io.*;public class Main { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamRe.. 2024. 5. 17.
[백준] 20006: 랭킹전 대기열 - JAVA https://www.acmicpc.net/problem/20006 풀이플레이어의 레벨과 닉네임이 주어진다. 플레이어를 방에 적절하게 배치시켜야 하는데 생성된 방이 없거나 들어갈 방이 없다면 해당 플레이어의 레벨을 기준으로 방을 생성하고, 생성된 방 중에 해당 방의 레벨을 기준으로 -10부터 +10 사이에 플레이어의 레벨이 있다면 방에 입장시킨다. 방의 정원이 꽉 찼으면 더이상 들어갈 수 없다. Node라는 클래스를 만들어 처음 선언될 때 해당 플레이어의 레벨로 초기화해주었고 닉네임 사전순으로 출력하기 위해 TreeMap에 넣어주었다.  메모리: 16396KB시간: 172ms언어: Java 11import java.util.*;import java.io.*;public class Main { sta.. 2024. 5. 17.
[프로그래머스] 마법의 엘리베이터 - JAVA https://school.programmers.co.kr/learn/courses/30/lessons/148653 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr 풀이주어진 층에서 10의 제곱수만큼 이동할 수 있는 엘리베이터를 최소로 이용하여 0층으로 가야한다. 일의자리부터 보면서 5보다 크면 한자리 올림할 만큼 위로 가주고, 5보다 작으면 0이 되도록 내려간다. 5일경우 다음 자리 수를 봐야하는데 다음 자리 수가 5보다 크면 올림으로 해주고 5보다 작으면 내림으로 해줘야 최소 횟수로 이동할 수 있다.  메모리: 79.3MB시간: 0.04ms언어: Java .. 2024. 5. 17.
[백준] 19637: IF문 좀 대신 써줘 - JAVA https://www.acmicpc.net/problem/19637 풀이N개의 문자열과 숫자가 주어진다. 해당 숫자 이하의 점수라면 해당 문자열이 칭호가 되는 것이다. 문자열과 점수를 배열에 저장해두고 M개의 점수가 나올 때마다 해당 배열을 이용해서 맞는 칭호를 출력해야 한다. 칭호의 개수 최대값이 10의 5제곱이기 때문에 앞에서부터 확인하면 시간초과가 발생한다. 따라서, 이분탐색을 통해 해당 구간에 점수가 포함되는지 확인해주었다.  메모리: 54040KB시간: 520ms언어: Java 11import java.util.*;import java.io.*;public class Main { static class Node { String name; int score; .. 2024. 5. 17.
[백준] 1138: 한 줄로 서기 - JAVA https://www.acmicpc.net/problem/1138 풀이키가 1인사람부터 N인사람이 순서대로 자기보다 큰 사람이 왼쪽에 몇 명 있는지 주어진다. 즉, 0 0 0 0 이렇게 주어지면 1번사람은 왼쪽에 자기보다 큰 사람이 0명 있으므로 첫 번째 자리에 서있는 것이다. 숫자를 받아 for문을 돌면서 자리가 안채워져 있으면 카운트를 하나씩 한다. 자리가 채워져있으면 넘어간다. 카운트가 입력받은 수와 같으면 그 자리에 해당 사람을 위치시키면 된다.  메모리: 15852KB시간: 144ms언어: Java 11import java.util.*;import java.io.*;public class Main { public static void main(String[] args) throws Exce.. 2024. 5. 17.
[백준] 5972: 택배 배송 - JAVA https://www.acmicpc.net/problem/5972 풀이1부터 N까지 이동해야하는데 길마다 지불해야할 비용이 있다. 즉, 다익스트라 알고리즘을 이용해 최솟값을 구해준다. ArrayList로 연결된 지점과 비용을 저장하고 dist배열을 만들고 최댓값으로 초기화해준다. 현재칸과 연결된 칸의 비용을 보면서 dist[다음칸]이 (`dist[현재칸] + 비용`)보다 크다면 더 작은 비용으로 이동할 수 있다는 것이므로 갱신해준다.  메모리: 41024KB시간: 484ms언어: Java 11import java.util.*;import java.io.*;public class Main { static class Node implements Comparable { int v; .. 2024. 5. 17.
[백준] 1522: 문자열 교환 - JAVA https://www.acmicpc.net/problem/1522 풀이a와 b로 이루어진 문자열이 주어지고, a를 모두 연속으로 만들어야 한다. 원형 문자열이기 때문에 aaabbba와 같은 문자열도 연속이다. a의 개수를 세어 aCount에 저장했다. 문자열을 처음부터 끝까지 탐색하면서 해당 인덱스를 시작으로하고 길이가 aCount인 부분문자열에서 b의 개수를 세주고 ans를 최솟값으로 갱신했다. b의 개수만큼 바꾸면 a가 연속이게 된다.  메모리: 14268KB시간: 128ms언어: Java 11import java.io.*;public class Main { public static void main(String[] args) throws Exception { BufferedRead.. 2024. 5. 17.