문제
도현이는 바구니를 총 N개 가지고 있고, 각각의 바구니에는 1번부터 N번까지 번호가 순서대로 적혀져 있다. 바구니는 일렬로 놓여져 있고, 가장 왼쪽 바구니를 1번째 바구니, 그 다음 바구니를 2번째 바구니, ..., 가장 오른쪽 바구니를 N번째 바구니라고 부른다.
도현이는 앞으로 M번 바구니의 순서를 회전시키려고 만들려고 한다. 도현이는 바구니의 순서를 회전시킬 때, 순서를 회전시킬 범위를 정하고, 그 범위 안에서 기준이 될 바구니를 선택한다. 도현이가 선택한 바구니의 범위가 begin, end이고, 기준이 되는 바구니를 mid라고 했을 때, begin, begin+1, ..., mid-1, mid, mid+1, ..., end-1, end 순서로 되어있는 바구니의 순서를 mid, mid+1, ..., end-1, end, begin, begin+1, ..., mid-1로 바꾸게 된다.
바구니의 순서를 어떻게 회전시킬지 주어졌을 때, M번 바구니의 순서를 회전시킨 다음, 바구니에 적혀있는 번호를 가장 왼쪽 바구니부터 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 N (1 ≤ N ≤ 100)과 M (1 ≤ M ≤ 100)이 주어진다.
둘째 줄부터 M개의 줄에는 바구니의 순서를 바꾸는 만드는 방법이 주어진다. 방법은 i, j, k로 나타내고, 왼쪽으로부터 i번째 바구니부터 j번째 바구니의 순서를 회전시키는데, 그 때 기준 바구니는 k번째 바구니라는 뜻이다. (1 ≤ i ≤ k ≤ j ≤ N)
도현이는 입력으로 주어진 순서대로 바구니의 순서를 회전시킨다.
출력
모든 순서를 회전시킨 다음에, 가장 왼쪽에 있는 바구니부터 바구니에 적혀있는 순서를 공백으로 구분해 출력한다.
풀이
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
ArrayList<Integer> temp = new ArrayList<Integer>();
ArrayList<Integer> temp2 = new ArrayList<Integer>();
// 바구니 개수
int a = scanner.nextInt();
// 바구니 1~10 숫자 넣기
int[] aa = new int[a];
for (int i = 1; i <= a; i++) {
aa[i-1] = i;
}
int b = scanner.nextInt();
for (int i = 0; i < b; i++) {
int begin = scanner.nextInt();
int end = scanner.nextInt();
int mid = scanner.nextInt();
temp.clear();
temp2.clear();
// mid부터 end까지 배열 인덱스
// ~를 담을 새 배열
for (int j = 0; j < end-(mid-1); j++) {
temp.add(aa[mid-1+j]);
}
// begin 부터 mid-1까지 담을 새 배열
for (int j = 0; j < mid-begin; j++) {
temp2.add(aa[begin-1+j]);
}
// temp2에 있는 값을 mid자리에 옮기기
for (int j = 0; j < mid-begin; j++) {
aa[(begin-1)+end-(mid-1)+j] = temp2.get(j);
}
// temp에 있는 값을 begin 자리에 옮기기
for (int j = 0; j < temp.size(); j++) {
aa[begin-1+j] = temp.get(j);
}
}
// 배열출력하기
for (int i = 0; i < aa.length; i++) {
System.out.println(aa[i]);
}
}
}
문제 이해하기가 좀 어려웠는데 혹시 나같은 사람이 있을까봐
그림으로 보기 쉽게 설명해보자면 아래와 같다.
begin ~ mid-1 와 mid ~ end까지의 바구니 위치를 바꾸면된다.
1.
// mid ~ end 까지 넣어줄 배열
ArrayList<Integer> temp = new ArrayList<Integer>();
// begin ~ mid-1 까지 넣어줄 배열
ArrayList<Integer> temp2 = new ArrayList<Integer>();
ArrayList를 만들어 begin ~ mid-1의 숫자를 넣어 줄 배열과 mid ~ end의 숫자를 넣어줄 배열을 만들었다.
가변길이 조절이 가능하기 때문에 ArrayList로 만들었다.
2.
// 바구니 개수
int a = scanner.nextInt();
// 바구니 1~10 숫자 넣기
int[] aa = new int[a];
for (int i = 1; i <= a; i++) {
aa[i-1] = i;
}
바구니 안에 1부터 입력받은 숫자까지 차례대로 숫자를 넣어주었다.
3.
int b = scanner.nextInt();
for (int i = 0; i < b; i++) {
int begin = scanner.nextInt();
int end = scanner.nextInt();
int mid = scanner.nextInt();
temp.clear();
temp2.clear();
b번 만큼 반복해서 입력받는 for문을 만들어주었다.
begin, end, mid를 입력받아준다.
i가 한번 다 돌아가면 temp 안에 있는 숫자를 비워주어야 하기때문에 Arraylist.clear()를 함수를 이용해 비워준다.
4.
// mid부터 end까지 배열 인덱스
// ~를 담을 새 배열
for (int j = 0; j < end-(mid-1); j++) {
temp.add(aa[mid-1+j]);
}
mid ~ end 까지 숫자를 차례대로 temp 안에 넣어준다.
5.
// begin 부터 mid-1까지 담을 새 배열
for (int j = 0; j < mid-begin; j++) {
temp2.add(aa[begin-1+j]);
}
begin ~ mid-1 까지의 숫자를 차례대로 temp2 안에 넣어준다.
begin = 1 / end = 6 / mid = 4 인 경우라면
temp 안에 4,5,6
temp2 안에 1,2,3 이 들어있다.
그럼 temp는 1번 바구니부터 temp길이 만큼 넣어주어야하고
temp2는 4번 바구니부터 temp2 길이 만큼 넣어주어야 한다.
6.
// temp2에 있는 값을 mid자리에 옮기기
for (int j = 0; j < mid-begin; j++) {
aa[(begin-1)+end-(mid-1)+j] = temp2.get(j);
}
aa[(begin-1)+end-(mid-1)+j] 라고 하면 복잡해보이지만,
쉽게 말하면 mid 바구니 번호부터 시작해서 넣어준다는 뜻이다.
그 안에 순서대로 temp2[0] 부터 끝까지 넣어준다.
Arraylist는 temp2[0] 대신 temp2.get(0) 이라고 적는다. 인덱스 0번의 값을 가져온다는 의미다.
7.
// temp에 있는 값을 begin 자리에 옮기기
for (int j = 0; j < temp.size(); j++) {
aa[begin-1+j] = temp.get(j);
}
마찬가지로 temp에 있는 값을 begin 자리에 넣어준다.
그리고 for문을 빠져나가 aa배열을 출력해준다.
'백준' 카테고리의 다른 글
[JAVA] 백준 1157번 단어 공부 (0) | 2023.03.23 |
---|---|
[JAVA] 백준 4344번 평균은 넘겠지 (0) | 2023.03.22 |
[JAVA] 백준 10988번 팰린드롬인지 확인하기 (0) | 2023.03.22 |
[JAVA] 백준 2444번 별 찍기 - 7 (0) | 2023.03.20 |
[JAVA] 백준 5622번 다이얼 (0) | 2023.03.20 |