본문 바로가기
알고리즘/백준

10811번 문제 : 바구니 뒤집기

by son_i 2023. 4. 15.
728x90

10811번: 바구니 뒤집기 (acmicpc.net)

 

10811번: 바구니 뒤집기

도현이는 바구니를 총 N개 가지고 있고, 각각의 바구니에는 1번부터 N번까지 번호가 순서대로 적혀져 있다. 바구니는 일렬로 놓여져 있고, 가장 왼쪽 바구니를 1번째 바구니, 그 다음 바구니를 2

www.acmicpc.net

처음 내가 생각한 건 리스트에 바구니 번호들을 넣어놓고

temp라는 리스트를 만들어서 인덱스만큼 쏙 빼서 역순 정렬하고 원본 리스트 인덱스에 맞게 다시 끼워넣기 !

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.StringTokenizer;

class Main{
	public static void main(String[] args) throws IOException {
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      
    	StringTokenizer st = new StringTokenizer(br.readLine());
    	int N = Integer.parseInt(st.nextToken());//바구니의 갯수
    	int M = Integer.parseInt(st.nextToken());//바구니를 역순으로 만들 방법 
    	
    	List <Integer>list = new ArrayList<>();
    	List <Integer>temp = new ArrayList<>();

    	for(int i=1;i<=N;i++) {
    		list.add(i);
    	}
    	for(int i =0;i<M;i++) {
    		st = new StringTokenizer(br.readLine());
    		int j = Integer.parseInt(st.nextToken());
    		int k = Integer.parseInt(st.nextToken());
    		int g = 0;
    		int c = 0;
    		temp.clear();
    		
    		for(int m=j-1;m<k;m++) {
    			temp.add(g,list.get(m));
    			g++;
    		}
    		for(int f=temp.size()-1;f>0;f--) { //temp 리스트에서 범위 숫자 역순 정렬
    			temp.add(c,temp.get(temp.size()-1));
    			temp.remove(temp.size()-1);
    			c++;
    		}
    		for(int n = 0;n<temp.size();n++) 
    			list.set((j-1+n),temp.get(n));
    	}
    	for(int i=0;i<list.size();i++) 
    		System.out.print(list.get(i)+" ");
    }
}

근데 그냥 배열로 해서 바꾸는 방식도 있어서 함 해봤다

package algorithm;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.StringTokenizer;

class Main{
	public static void main(String[] args) throws IOException {
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      
    	StringTokenizer st = new StringTokenizer(br.readLine());
    	int N = Integer.parseInt(st.nextToken());//바구니의 갯수
    	int M = Integer.parseInt(st.nextToken());//바구니를 역순으로 만들 방법 
    	
    	int arr[] = new int[N];

    	for(int i=0;i<N;i++) {
    		arr[i] = i+1;
    	}
    	for(int i =0;i<M;i++) {
    		st = new StringTokenizer(br.readLine());
    		int j = Integer.parseInt(st.nextToken());
    		int k = Integer.parseInt(st.nextToken());
    		
    		int temp = 0;
    		while(true) {
    			temp = arr[j-1];
    			arr[j-1] = arr[k-1];
    			arr[k-1] = temp;
    			
    			j++;
    			k--;
    			if(j>k)break;
    		}
    	}
    	for(int i=0;i<arr.length;i++) 
    		System.out.print(arr[i]+" ");
    }
}

코드는 훨씬 간단 !

시간은 비슷 ~.~

 

자꾸만 더 쉬운 방법이 없나 고민해봐야겠다