728x90
2161 카드1 - 실버5
https://www.acmicpc.net/problem/2161
2161번: 카드1
N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있다. 이제 다음과 같은 동작을 카드가
www.acmicpc.net
- 길이가 7이라면 7+6+5+...+2+1 = (7+1)*7/2 길이의 배열을 만드는 방법도 사용할 수 있고
- 큐를 사용할 수 있다.
- 정수는 1000까지니까 최대 (1000+1)*1000/2 = 500500 길이의 배열이 만들어질 것이니까..
- 큐를 사용하는 게 좋을 것 같다!
큐를 이용한 풀이
class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
Queue<Integer> queue = new LinkedList<>();
for (int i =1; i<=n; i++)
queue.add(i);
List<Integer> list = new ArrayList<>();
while (queue.size() != 1) {
list.add(queue.poll());
if (queue.size() == 1)
break;
int tmp = queue.poll();
queue.add(tmp);
}
StringBuffer sb = new StringBuffer();
for (int num: list) {
sb.append(num);
sb.append(" ");
}
sb.append(queue.poll());
System.out.println(sb);
}
}
- 정말 문제에서 요구하는 그대로 구현하면 됨
1158 요세푸스 문제 - 실버4
https://www.acmicpc.net/problem/1158
1158번: 요세푸스 문제
첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000)
www.acmicpc.net
- 원형 큐를 사용하면 어렵지않게 풀릴 것 같다
class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st= new StringTokenizer(br.readLine());
int manCnt = Integer.parseInt(st.nextToken());
int k = Integer.parseInt(st.nextToken());
Queue<Integer> queue= new LinkedList<>();
for (int i= 1; i<=manCnt; i++)
queue.add(i);
int cnt = 1;
StringBuffer sb= new StringBuffer();
sb.append("<");
while (!queue.isEmpty()) {
if (cnt == k) {
sb.append(queue.poll());
if (!queue.isEmpty())
sb.append(", ");
cnt = 1;
} else {
queue.add(queue.poll());
cnt++;
}
}
sb.append(">");
System.out.println(sb);
}
}
- 큐에 값을 하나씩 넣은 후 하나씩 빼면서 k번째 값인지 확인한다
- cnt를 세며 k가 됐을 때 stringBuffer에 값을 넣는다
- k가 되지 않았을 경우엔 poll()한 값을 다시 큐에 넣어준다
- 이 과정을 큐가 빌 때까지 반복한다
2346 풍선 터뜨리기 - 실버3
https://www.acmicpc.net/problem/2346
2346번: 풍선 터뜨리기
1번부터 N번까지 N개의 풍선이 원형으로 놓여 있고. i번 풍선의 오른쪽에는 i+1번 풍선이 있고, 왼쪽에는 i-1번 풍선이 있다. 단, 1번 풍선의 왼쪽에 N번 풍선이 있고, N번 풍선의 오른쪽에 1번 풍선
www.acmicpc.net
- 왼쪽과 오른쪽으로 모두 이동이 가능해야한다 -> 데크를 사용하는 게 좋을듯
- 양수이면 원래 큐처럼 이동시키고, 음수이면 반대로 이동시키면 될 것 같다
- 풍선 번호와 이동 숫자를 저장해야함
- 풍선번호를 인덱스로 하고, 이동숫자를 값으로 하는 배열 하나를 만들어야할 것 같고
- 데크에는 풍선번호만 저장하면 될 듯
풀이
class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int cnt = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
int[] moveArr = new int[cnt+1];
Deque<Integer> deque = new ArrayDeque<>();
for (int i = 1; i<cnt+1; i++) {
moveArr[i] = Integer.parseInt(st.nextToken());
deque.add(i);
}
StringBuffer sb = new StringBuffer();
int move = moveArr[deque.poll()];
sb.append(1); sb.append(" ");
while (!deque.isEmpty()) {
int val;
if (move > 0) {
//큐처럼 이동
while (move != 1) {
deque.addLast(deque.removeFirst());
move--;
}
val = deque.removeFirst();
} else {
//큐 반대로 이동
while (move != -1) {
deque.addFirst(deque.removeLast());
move++;
}
val = deque.removeLast();
}
sb.append(val);
if (!deque.isEmpty())
sb.append(" ");
move = moveArr[val];
}
System.out.println(sb);
}
}
- 순서번호를 인덱스로 이동방향&이동정도을 알 수 있는 moveArr을 저장
- 이동방향&이동정도가 양수이면 원래 원형큐처럼 이동하고
- 음수이면 원형큐 반대 방향으로 이동한다
- 배운 점: 나는 while문에서 (1)이동 후 (2)값을 빼서 출력 하는 방식을 사용했다
- 구글링을 해보니 (1)값을 빼고 출력 후 (2)이동 하는 방식을 많이 사용하셨다
- 이 방식이 코드길이도 줄어들고 보기 좋았다
- 또한 나처럼 while문으로 하는 것보다 그냥 횟수를 for문으로 지정해서 삭제&삽입하는 방식이 더 좋은 것 같다
- sb.append(num).append(" "); 이런 문법이 있는 것도 처음 알았다!
- deque 크기가 1일때까지만 반복하고, 마지막에 append(" ")를 안해주는 게 매번 queue.isEmpty를 검사하지 않아도 되어 좋은듯
- 참고한 풀이: https://velog.io/@brince/%EB%B0%B1%EC%A4%80-2346%EB%B2%88-%EC%9E%90%EB%B0%94-%ED%92%80%EC%9D%B4
1927 최소 힙 - 실버2
https://www.acmicpc.net/problem/1927
1927번: 최소 힙
첫째 줄에 연산의 개수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 자연수라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0
www.acmicpc.net
- 문제 이름에서 알 수 있듯 최소 힙 사용을 연습하기 좋을 것 같다
- 자바에서 힙은 PriorityQueue를 사용한다 -> 사용법만 알면 어렵지 않은 문제인 것 같음
class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int cnt = Integer.parseInt(br.readLine());
PriorityQueue<Integer> minHeap = new PriorityQueue<>();
StringBuffer sb = new StringBuffer();
for (int i =0; i<cnt; i++) {
int cal = Integer.parseInt(br.readLine());
if (cal == 0) {
if (minHeap.isEmpty())
sb.append(0);
else
sb.append(minHeap.poll());
sb.append("\n");
} else {
minHeap.add(cal);
}
}
System.out.println(sb);
}
}
- 그냥 하라는대로 따라가면 된다
다음 공부: 데크,스택, 큐, 최소힙&최대힙 사용법 제대로 정리 및 공부!
728x90
'알고리즘 > 백준' 카테고리의 다른 글
| [JAVA] 백준 13904 과제 - 골드3 (1) | 2023.10.08 |
|---|---|
| [JAVA] 백준 힙 모음(11286, 1374, 7662) (1) | 2023.10.06 |
| [JAVA] 백준 data structures - 브론즈모음(2605, 12605) (0) | 2023.10.06 |
| [JAVA] 백준 dp - 브론즈, 실버모음(24416, 1010, 9625, 2491) (0) | 2023.10.04 |
| [JAVA] 백준 dp - 브론즈모음(2748 피보나치 수 2, 2775 부녀회장이 될테야, 17202 핸드폰 번호 궁합) (1) | 2023.10.04 |