SMALL
1. 문제
https://www.acmicpc.net/problem/10811
10811번: 바구니 뒤집기
도현이는 바구니를 총 N개 가지고 있고, 각각의 바구니에는 1번부터 N번까지 번호가 순서대로 적혀져 있다. 바구니는 일렬로 놓여져 있고, 가장 왼쪽 바구니를 1번째 바구니, 그 다음 바구니를 2
www.acmicpc.net
2. 주요 개념
- 1차원 배열 선언/할당
- 반복문 (for문), 중첩 반복문
- 스캐너 ~ 값 입력 받기
- 조건문
- continue
3. 나의 풀이 (*은 잘 안풀린 부분)
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int n, m, i, j, t, temp;
// n: 바구니 갯수, m: 바구니를 바꿀 횟수
// i: 바꿀 시작 바구니, j: 바꿀 끝 바구니
// t: 반복문에 사용하는 변수
// temp: 바구니 번호 임시 저장소
n = s.nextInt();
m = s.nextInt();
if ( 1<=n && n<=100 && 1<=m && m<=100 ){
int[] arr = new int[n];
// 바구니 번호
for (t = 0; t < n; t++) {
arr[t] = t + 1;
} // 배열에 번호 부여
for (t = 0; t < m; t++) {
i = s.nextInt();
// 음수 인덱스: 에러 발생 -> 하위 조건문에서 i-1 실행.
j = s.nextInt();
// 음수 인덱스: 에러 발생 -> 하위 조건문에서 j-1 실행.
if ( i<j ) {
if (j-i==1){
temp = arr[i-1]; // 배열 인덱스와 1 차이 남.
arr[i-1] = arr[j-1];
arr[j-1] = temp;
} else {
int c = (j-i+1)/2; // 바꿀 횟수 지정
// c 선언 과정에서 배열 초과 에러 발생 > 해결!
for (int a = 0; a<c; a++) {
temp = arr[i-1];
arr[i-1] = arr[j-1];
arr[j-1] = temp;
i++;
j--;
}
}
} else if ( i==j ) {
continue;
} else {
System.out.println("i, j 다시 입력");
}
}
for (t = 0; t < n; t++) {
System.out.print(arr[t] + " ");
}
} else {
System.out.println("n, m 다시 입력");
}
}
}
4. 짚고 넘어가기!
- 초반에 계속 런타임 에러 (ArrayIndexOutOfBounds) 발생
- why?
- 1. (문제) i와 j값을 입력할 때, 1 작은 값으로 저장하도록 선언 > 반복문에서 음수 인덱스로 바뀌는 상황 발생
> (해결)각 반복문에서 "인덱스 - 1"을 하여 음수 인덱스가 되지 않도록 수정!
=> 음수 인덱스를 사용하면, ArrayIndexOutOfBounds 발생
- 2. (문제) 변수 c(바꿀 횟수 지정)에서 배열을 벗어나는 인덱스 값 생성
> (해결) 반복 횟수가 (j-i+1)/2 이라는 규칙 발견 후, 수정!
=> 인덱스가 배열 인덱스를 벗어나면, ArrayIndexOutOfBounds 발생
- 바구니 번호와 실제 배열의 숫자 차이는 1! => 배열 값을 바꿀 땐, 차이 1을 고려하여서 코드 작성!
728x90
'Algorithm > Java' 카테고리의 다른 글
[백준] n.10809 - 한 단어에 있는 알파벳의 위치 찾기 (0) | 2023.05.18 |
---|---|
[백준] n.9086 - 각 문자열의 first, last 문자를 함께 출력하기 (0) | 2023.05.17 |
[백준] n.27866 - 문자열 속 i번째 글자 출력 (0) | 2023.05.16 |
[백준] n.1546 - 조작된 평균 구하기 (0) | 2023.05.15 |
[백준] n.3052 - 서로 다른 나머지 개수 구하기 (0) | 2023.05.12 |
댓글