알고리즘 문제풀이/백준 158

#2798 : 블랙잭

풀이방법 사용된 것: TreeSet 브루트포스 알고리즘 2022.04.17 가능한 모든 수 3개의 쌍(순서 관계 없이)을 모두 만든 다음, 그 중 합이 m보다 작거나 같은 것들을 모두 TreeSet에 넣는다. TreeSet은 자동으로 숫자를 오름차순으로 정리하므로, TreeSet의 가장 뒤에 있는 수를 화면에 출력하면 된다. 모든 쌍을 점검해야 하므로 브루트포스 알고리즘 문제이다. 코드 Java(2022.04.17) import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; import java.util.TreeSet; public cla..

#2164 : 카드2

풀이방법 사용된 것: Deque 2022.04.17 덱을 사용하면 쉽게 풀리는 문제이다. 덱에 1부터 N까지를 순서대로 넣은 다음, removeFirst() 한 번, removeFirst()를 해서 그 값을 temp에 저장하기, temp를 addLast()하기를 N-1번 반복하면 된다. 그 후 남아있는 하나의 값을 화면에 출력한다. 스택이나 큐로도 풀 수 있지만 그렇게 하면 다른 쪽 끝을 조작하는 함수를 따로 만들어주어야 하므로 편하게 덱을 사용하였다. 코드 Java(2022.04.17) import java.util.Deque; import java.util.LinkedList; import java.util.Scanner; public class Main { public static void main..

#1978 : 소수 찾기

풀이방법 사용된 것: 수학 에라토스테네스의 체 2022.04.17 에라토스테네스의 체의 방식으로 1부터 1000까지의 모든 소수를 구해둔 다음, 구해둔 소수 목록을 이용하여 입력으로 주어지는 수들이 소수인지를 판별하면 된다. 코드 Java(2022.04.17) import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws IOException{ // TODO Auto-generate..

#2609 : 최대공약수와 최소공배수

풀이방법 사용된 것: 수학 2022.04.17 간단한 수학 문제이다. 최대공약수를 구하는 방법은 다음과 같다. 주어진 두 수 중 작은 쪽의 약수를 모두 구하여, 가장 작은 약수부터 큰 약수까지의 순으로 스택에 넣는다. 스택의 top부터 하나씩 꺼내면서, 즉 가장 큰 약수부터 작은 약수까지의 순서로 꺼내면서 해당 수가 주어진 두 수 중 큰 쪽의 약수인지 확인한다. 주어진 두 수 중 큰 쪽의 약수인 수가 발견되면 즉시 그 수를 최대공약수로 취하고 반복문을 종료한다. 최소공배수를 구하는 방법은 다음과 같다. 주어진 두 수 중 작은 쪽에 2, 3, 4, ... 갈수록 1씩 큰 자연수를 곱해가면서 곱의 결과값이 주어진 두 수 중 큰 쪽의 배수인지 확인한다. 주어진 두 수 중 큰 쪽의 배수인 수가 발견되면 즉시 그..

#2930 : 가위 바위 보

풀이방법 사용된 것: 그리디 알고리즘 브루트포스 알고리즘 2022.04.16 각 라운드별 친구들이 낸 가위의 수, 바위의 수, 보의 수를 세놓으면 그 다음부터는 쉽다. 알고리즘은 간단하지만 코드로 구현하기가 조금 귀찮은 문제였다. 푼 방법은 다음과 같다. 백준의 세 번째 예제를 보면, 4 SPRS 4 RPRP SRRR SSPR PSPS 1라운드에서 가위를 낸 친구는 2명, 바위를 낸 친구는 1명, 보를 낸 친구는 1명이다. 2라운드에서 가위를 낸 친구는 2명, 바위를 낸 친구는 1명, 보를 낸 친구는 1명이다. 3라운드에서 가위를 낸 친구는 0명, 바위를 낸 친구는 2명, 보를 낸 친구는 2명이다. 4라운드에서 가위를 낸 친구는 1명, 바위를 낸 친구는 2명, 보를 낸 친구는 1명이다. 이렇게 개수를 싹..

#4673 : 셀프 넘버

풀이방법 사용된 것: 함수형 프로그래밍 20022.04.16 모든 요소의 값이 0으로 초기화된, 길이가 10001인 int형 1차원 배열 arr을 만든다. 1부터 10000까지의 모든 정수에 대하여 문제에서 말한 d(n)을 수행할 것이다. 이 때, 어떤 정수 n에 대하여 수행한 d(n)의 결과값을 num이라 할 때 arr[num]에 저장된 값을 1 증가시킨다. 그럼 d(n)의 결과값으로 한 번도 도출된 적이 없는 수들은 arr에서 해당 인덱스에 저장된 값이 0으로 남아있게 된다. 따라서 arr[1]부터 arr[10000]까지 중 0이 저장되어있는 요소가 발견되면 요소의 인덱스 값을 화면에 출력하면 된다. d(n)을 함수로 구현하여 반복문을 통해 1부터 10000까지의 n에 대하여 d(n)을 수행해야 하므..

#1966 : 프린터 큐

풀이방법 사용된 것: Queue 정렬 2022.04.13 문서들의 우선순위들만을 따로 1차원 Integer 배열 ranks에 저장한 뒤, 이 배열을 내림차순으로 정렬하고, 가장 앞(ranks[0])부터 차례차례 방문하였다. ranks 방문에 사용되는 인덱스 변수를 i라 하자. 가장 우선순위가 높은 문서 하나가 인쇄되면 i의 값을 1 증가시킨다. 그럼 방금 인쇄한 문서의 바로 다음으로 우선순위가 높은, 즉 이제 인쇄해야 하는 문서의 우선순위를 알 수 있다. 이제 인쇄해야 하는 문서의 우선순위 값을 cur이라 하고 현재 큐의 가장 앞에 있는 문서의 우선순위를 r이라 하자. r == cur 이라면 인쇄를 하고, r != cur 이라면 인쇄를 하지 않고 그 문서를 큐의 가장 뒤로 보낸다. r == cur 이어서..

#11650 : 좌표 정렬하기

풀이방법 사용된 것: 정렬 Comparator Overriding 2022.04.13 Comparator를 오버라이딩하면 쉽게 풀리는 문제이다. 코드 Java(2022.04.13) import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.Comparator; import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws IOException{ // TODO Auto-generated method stub Bu..

#10845 : 큐

풀이방법 사용된 것: Queue 2022.04.13 Switch-case문을 활용하여 풀어주면 된다. back의 구현만 신경쓰면 되는데, 나는 새로운 수가 추가될 때마다 int형 변수 back의 값을 새로 추가되는 수의 값으로 업데이트해주었다. 코드 Java(2022.04.13) import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.LinkedList; import java.util.Queue; import java.util.StringTokenizer; public class Main { public static void main(String[] args) th..