[백준] 10811번 바구니 뒤집기 - Java
내 틀린 접근 & 해설참고 ⚠️
문제
해설
내 틀린 풀이
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] num = new int[n+1];
int m = sc.nextInt();
for(int i = 0; i < n+1; i++){
num[i] = i;
}
//바구니 뒤집기
for(int i = 0; i < m; i++) {
int temp = 0;
int temp2 = 0;
int a = sc.nextInt();
int b = sc.nextInt();
if((b-a)==0) continue;
if((b-a) < 3){
temp = num[a];
num[a] = num[b];
num[b] = temp;
}else{
temp = num[a];
temp2 = num[a+1];
num[a] = num[b];
num[b] = temp;
num[a+1] = num[b-1];
num[b-1] = temp2;
}
}
for(int j = 1; j < num.length; j++) System.out.print(num[j] + " ");
}
}
역순으로 만드는 방법에서 구하는 i 와 j (각 a,b)의 차를 통해서 총 세가지로 정의했다.
1) 차이가 0일 때는 바꿀 필요가 없으므로 continue를 통해 넘어간다.
2) 차이가 3보다 작을 때는 i와 j의 자리에 있는 위치만 서로 바꾼다.
3) 차이가 3이나 4일 때(else)는 i와 j의 자리를 바꾸고, i+1자리와 j-1의 자리를 서로 각각 바꾼다.
이런 식으로 접근하여 풀었고 인텔리제이에서 돌렸을 때는 답은 맞게 나왔지만, 백준 정답에는 "틀렸습니다." 가 나왔다.
올바른 접근 (해설 참고)
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); // n개의 바구니
int m = sc.nextInt(); // 시행 횟수
int temp=0;
int num[] = new int[n];
for(int i=0;i<num.length;i++) {
num[i] = i+1;
}
for(int i=0;i<m;i++) {
int a = sc.nextInt()-1; //1 > 0번째 배열
int b = sc.nextInt()-1; //5 > 4번째 배열
while(a<b) {
temp = num[a];
num[a] = num[b];
num[b] = temp;
a++;
b--;
}
}
sc.close();
for(int i=0;i<num.length;i++) {
System.out.print(num[i]+" ");
}
}
}
나와 다르게 a, b를 각각 ++, -- 를 통해서 올리고 내리는 while문의 a<b라는 조건을 통해서 다음 칸을 swap하는 구조로 짤 수 있다.
'백준 문제풀이 > Java' 카테고리의 다른 글
[백준] 2743번 단어 길이 재기 (0) | 2024.03.19 |
---|---|
[백준] 27866번 문자와 문자열 (0) | 2024.03.19 |
[백준] 5597번 과제 안 내신 ..? ⚠️ (0) | 2024.03.18 |
[백준] 10813번 공 바꾸기 (0) | 2023.12.18 |
[백준] 10810번 공 넣기 (0) | 2023.12.18 |