담배팔이소년

[BOJ] 13415 정렬 게임 본문

Algorithm

[BOJ] 13415 정렬 게임

bkkmw 2023. 1. 18. 23:40

https://www.acmicpc.net/problem/13415

 

13415번: 정렬 게임

즐거운 컴퓨터 프로그래밍 시간! 이번 시간의 수업 내용은 정렬이었다. 학생들은 오름차순 또는 내림차순으로 입력받은 값을 정렬해보기 시작하였다. 수업이 끝나갈 무렵, 오늘도 어김없이 조

www.acmicpc.net

 

문제 풀이

 

package boj;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Collections;
import java.util.StringTokenizer;

public class MainB_13415 {

	public static void main(String[] args) throws Exception{
		System.setIn(new FileInputStream("input/boj/input_13415.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		
		int N = Integer.parseInt(br.readLine());
		int[] seq = new int[N];
		
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		for(int i=0; i<N; i++) 
			seq[i] = Integer.parseInt(st.nextToken());
		
		int K = Integer.parseInt(br.readLine());
		int[][] set = new int[K][2];
		
		for(int i=0; i<K; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			set[i][0] = Integer.parseInt(st.nextToken()) - 1;
			set[i][1] = Integer.parseInt(st.nextToken()) - 1;
		}
		
		seq = solve(seq, set, N, K);
		
		print_ans(seq, N, sb);
		System.out.println(sb.toString());
		br.close();
	}
	
	static int[] solve(int[] seq, int[][] set, int N, int K) {
		int[][] stack = find_valid_sets(set, K);
		
		seq = play_sets(seq, stack, N, K);
		return seq;
	}
	
	static int[][] find_valid_sets(int[][] set, int K){
		int[][] ret = new int[K*2+1][2];
		int top = -1;
		int max = 0;
		
		for(int i=0; i<2*K; i++) {
			
			int cur = set[i/2][i%2];
			
			if(cur >= max) {
				// clear stack & push cur
				top = -1;
				ret[++top][0] = cur;
				ret[top][1] = i%2;
				max = cur;
				continue;
			}
			while(top > -1 && ret[top][0] < cur) {
				top--;
			}
			ret[++top][0] = cur;
			ret[top][1] = i%2;
		}
		ret[2*K][0] = top;
		return ret;
	}
	
	static int[] play_sets(int[] seq, int[][] stack, int N, int K) {
		int top = stack[2*K][0];
		seq = initial_sort(seq, stack[0][0], stack[0][1]);
		for(int i=1; i<=top; i++) {
			if(stack[i][1] != stack[i-1][1]) {
				seq = reverse_order_(seq, stack[i][0]);
			}
		}
		return seq;
	}
	
	static int[] initial_sort(int[] seq, int dst, int order) {
		Arrays.sort(seq, 0, dst+1);
		if(order == 1) {
			seq = reverse_order(seq, dst);
		}
		return seq;
	}
	
	static int[] reverse_order(int[] seq, int dst) {
		int len = seq.length;
		int ret[] = new int[len];
		
		for(int i=0; i<=dst; i++) {
			ret[dst-i] = seq[i];
		}
		for(int i=dst+1; i<len; i++) {
			ret[i] = seq[i];
		}
		
		return ret;
	}
	
	static int[] reverse_order_(int[] seq, int dst) {
		for(int i=0; i<=dst/2; i++) {
			int temp = seq[dst-i];
			seq[dst-i] = seq[i];
			seq[i] = temp;
		}
		return seq;
	}
	
	static void print_ans(int[] seq, int N, StringBuilder sb) {
		for(int i=0; i<N; i++) {
			sb.append(seq[i]).append(" ");
		}
	}
}

'Algorithm' 카테고리의 다른 글

[Programmers] 140107 점 찍기  (0) 2023.04.16
[BOJ] 14442 벽 부수고 이동하기 2  (0) 2023.01.18
[BOJ] 01446 지름길  (0) 2023.01.15
[BOJ] 17143 낚시왕  (0) 2023.01.07
[BOJ] 22251 빌런 호석  (0) 2023.01.06
Comments