[java] 백준 10811번 : 바구니 뒤집기

hjeu·2023년 6월 25일

백준

목록 보기
2/48

1. 문제


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

도현이는 앞으로 M번 바구니의 순서를 역순으로 만들려고 한다. 도현이는 한 번 순서를 역순으로 바꿀 때, 순서를 역순으로 만들 범위를 정하고, 그 범위에 들어있는 바구니의 순서를 역순으로 만든다.

바구니의 순서를 어떻게 바꿀지 주어졌을 때, M번 바구니의 순서를 역순으로 만든 다음, 바구니에 적혀있는 번호를 가장 왼쪽 바구니부터 출력하는 프로그램을 작성하시오.

2. 입력


첫째 줄에 N (1 ≤ N ≤ 100)과 M (1 ≤ M ≤ 100)이 주어진다.

둘째 줄부터 M개의 줄에는 바구니의 순서를 역순으로 만드는 방법이 주어진다. 방법은 i j로 나타내고, 왼쪽으로부터 i번째 바구니부터 j번째 바구니의 순서를 역순으로 만든다는 뜻이다. (1 ≤ i ≤ j ≤ N)

도현이는 입력으로 주어진 순서대로 바구니의 순서를 바꾼다.

3. 출력


모든 순서를 바꾼 다음에, 가장 왼쪽에 있는 바구니부터 바구니에 적혀있는 순서를 공백으로 구분해 출력한다.

4. 나의 풀이


import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		
		int num = 0;
		int n = sc.nextInt();
		int m = sc.nextInt();
		
		int[] N = new int[n];
		
		for(int i=0; i<n; i++)
			N[i] = i+1;
		
		for(int i=0; i<m; i++) {
			int j = sc.nextInt();
			int k = sc.nextInt();
			
			for(int y=k; y>=j; y--) {
				for(int u=j; u<y; u++) {
					num = N[u];
					N[u] = N[u-1];
					N[u-1] = num;
				}
				
			}
		}
		
		for(int i=0; i<n; i++)
			System.out.print(N[i] + " ");

	}
}

이렇게 푸는게 맞는지 아직도 의문이 들지만...
3중 for문은 단단히 잘못됐음을 느끼고 있다... for문 하나당 O(n)의 시간복잡도를 갖는데 현재 내가 쓴게 3중 for문이니... 이 알고리즘의 시간복잡도는 O(n^3)이다...

그래서 찾아보니 2중 for문으로 가능한게 있었다.

5. 다른 풀이

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		
		int num = 0;
		int n = sc.nextInt();
		int m = sc.nextInt();
		
		int[] N = new int[n];
		
		for(int i=0; i<n; i++)
			N[i] = i+1;
		
		for(int i=0; i<m; i++) {
			int j = sc.nextInt() - 1; /* 배열을 위해 */
			int k = sc.nextInt() - 1;
			
			for(int y=j; y<=k; y++, k--) { /* y값은 커지고 k값은 작아지면서 for문을 돌리지 않아도 자리를 바꿀 수 있음 */
				num = N[y];
				N[y] = N[k];
				N[k] = num;				
			}
		}
		
		for(int i=0; i<n; i++)
			System.out.print(N[i] + " ");

	}
}

이런식으로 할 수 있다. 다양한 방법들이 있긴하지만 그래도 쉬우니까!

profile
나는야 개발왕이 될거야! (๑ •̀ω•́)۶

0개의 댓글