알고리즘 문제풀이/백준

#10804 : 카드 역배치

모항 2023. 3. 12. 23:35

풀이방법

사용된 것:

시뮬레이션

구현

스택 (Stack)

 

 

 

 

 

2023.03.12

1부터 20까지의 숫자가 적힌 카드 20장이 오름차순으로 정렬되어있는 상황이다.

시작 수와 끝 수를 입력하면, 그 구간 안의 카드들만 역순으로 배열하면 된다.

시작 수의 끝 수 쌍은 총 10번 주어진다.

 

보자마자 First In Last Out이라는 생각이 들어, 스택을 사용했다.

 

주어진 구간 사이의 수들을 순서대로 스택에 넣은 뒤, 스택에서 pop() 하며 수를 바꾸어준다. 이를 10번 반복한다.

 

코드를 편하게 짜기 위해, 길이가 20이 아닌 21인 배열을 선언하였다. 각 카드의 실제 순서와 배열 상의 인덱스가 서로 일치하도록 하기 위해서이다.

 

코드

Java(2023.03.12)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
import java.util.StringTokenizer;

public class Main {

	public static void main(String[] args) throws IOException{
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		//20장의 숫자 정보를 담을 배열 선언
		Integer[] list = new Integer[21];
		//1부터 20까지의 숫자를 카드에 할당
		for(int i=1; i<21; i++) list[i] = i;
		
		//문제풀이 수행
		for(int i=0; i<10; i++) {
			//시작 수와 끝 수 읽어오기
			StringTokenizer st = new StringTokenizer(br.readLine());
			Integer start = Integer.parseInt(st.nextToken());
			Integer end = Integer.parseInt(st.nextToken());
			//스택 선언
			Stack<Integer> stack = new Stack<Integer>();
			//스택을 사용해 First In Last Out으로 숫자 뒤집기
			for(int j=start; j<=end; j++) stack.add(list[j]);
			for(int j=start; j<=end; j++) list[j] = stack.pop();
		}
		
		//정답 출력
		for(int i=1; i<21; i++) System.out.print(list[i] + " ");
		
		

	}

}

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

#1427 : 소트인사이드  (0) 2023.03.12
#2587 : 대표값2  (0) 2023.03.12
#2884 : 알람 시계  (0) 2023.03.08
#5585 : 거스름돈  (0) 2023.01.19
#1049 : 기타줄  (0) 2023.01.18