[백준 10431번 JAVA] 줄세우기 (Stack으로 어렵게 풀고 실패하기)
by mini_min백준 문제
스택으로 어렵게 풀었다. 실버5 문제인데...ㅎ
다들 for 로 풀었더라 🥲 이전에 비슷한 문제를 stack 자료구조 이용해서 풀었던 기억이 있어서 stack 이 딱 떠올랐는데...
stack 2개 만들어서 풀었는데 문제를 너무 어렵게 생각했나봄... (결론 이렇게 풀면 틀림)
내 코드 (틀렸다고 뜸)
<내 풀이>
Max 용 stack 을 만들어서 Max 스택에 값이 더 크면 stack 에 저장하고 size 체크하고 그렇게 풀어봄.
stack push, pop, peek 하면서 더 번거롭게 풀었다.
<정답>
for 문에 20개 숫자 모두 집어넣고,
첫번째 숫자부터 본인보다 큰 수가 있는지 count 로 체크해서 풀자.
package baekjoon;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Stack;
import java.util.StringTokenizer;
public class _10431 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int tc = Integer.parseInt(br.readLine());
for( int i= 0; i < tc; i++ )
{
StringTokenizer st = new StringTokenizer(br.readLine());
int count = 0;
String caseNum = st.nextToken(); // 1, 2, 3, 4
Stack<Integer> stack = new Stack<>();
Stack<Integer> Maxstack = new Stack<>();
for ( int j = 0; j < 20; j++ )
{
int student = Integer.parseInt(st.nextToken());
if( ! Maxstack.isEmpty() && ( Maxstack.peek() > student) )
{
count += stack.size() + Maxstack.size();
stack.push(student);
} else if ( ! Maxstack.isEmpty() && ( Maxstack.peek() < student) )
{
//걸음 이동 x
stack.push(Maxstack.pop());
Maxstack.push(student);
} else if ( Maxstack.isEmpty() )
{
Maxstack.push(student);
}
}
bw.write(caseNum + " " + count + "\n");
}
br.close();
bw.flush();
bw.close();
}
}
정답 코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
//줄세우기
/**
* 1 ~ 20
* 같은 키는 없다.
* 아무나 한 명.
* 자기 앞에 자기보다 키가 큰 학생이 1명 이상이라도 있다면, 그중 가장 앞에 있는 학생 앞에 선다.
* 이때, 가장 앞에 있던 a 부터 그 뒤에 모든 학생들은 한 발씩 뒤로 물러난다.
* -> 결국 오름차순으로 줄을 설 수 있다.
*
* 학생들이 뒤로 물러난 걸음 수의 총합
*
* stack 에 쌓고, 그 값을 비교. stack size 를 누적
*
*/
public class _10431 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int tc = Integer.parseInt(br.readLine());
for( int i= 0; i < tc; i++ )
{
StringTokenizer st = new StringTokenizer(br.readLine());
String caseNum = st.nextToken(); // 1, 2, 3, 4
int [] arr = new int[20];
for ( int j =0; j < 20; j ++)
{
arr[j] = Integer.parseInt(st.nextToken());
}
int count = 0;
for ( int j =0; j < 20; j++ )
{
for ( int k=j+1; k<20; k++ )
{
if( arr[j] > arr[k])
{
count++;
}
}
}
bw.write(caseNum + " " + count + "\n");
}
br.close();
bw.flush();
bw.close();
}
}
'매일매일 알고리즘 공부' 카테고리의 다른 글
[백준 9655번 JAVA] 돌 게임 (1) | 2024.04.10 |
---|---|
[백준 11723번 JAVA] 집합 (비트마스킹) (0) | 2024.04.10 |
[백준 23971번 JAVA] ZOAC 4 (0) | 2024.04.08 |
[백준 JAVA] 11052번 풀이 - 카드 구매하기 (+16194번) (0) | 2023.11.23 |
[백준 JAVA] 9095번 풀이 - 1, 2, 3 더하기 (DP) (0) | 2023.11.21 |
블로그의 정보
개발자 미니민의 개발로그
mini_min