728x90
SMALL
백준 문제 풀이: 10811 [바구니 뒤집기]
문제 링크: https://www.acmicpc.net/problem/10811
문제 설명:
1번부터 N번까지 번호가 적힌 바구니가 일렬로 배치되어 있습니다. M번의 작업 동안 각 작업에서 바구니의 일부 구간을 선택하여 해당 구간의 순서를 뒤집습니다. 모든 작업이 끝난 후 바구니의 최종 상태를 출력하는 문제입니다.
문제 해결 코드
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); // 입력을 받기 위한 Scanner 객체 생성
int n = scanner.nextInt(); // 바구니의 개수
int m = scanner.nextInt(); // 뒤집기 작업의 횟수
// 바구니 초기화 (1번부터 N번까지 번호)
int[] arr = new int[n + 1];
for (int i = 1; i <= n; i++) {
arr[i] = i;
}
// M번의 뒤집기 작업 수행
for (int i = 0; i < m; i++) {
int a = scanner.nextInt(); // 시작 바구니 번호
int b = scanner.nextInt(); // 끝 바구니 번호
// 구간 [a, b]의 순서를 뒤집음
for (int j = 0; j < (b - a + 1) / 2; j++) {
int temp = arr[a + j];
arr[a + j] = arr[b - j];
arr[b - j] = temp;
}
}
// 결과 출력
for (int i = 1; i <= n; i++) {
System.out.print(arr[i] + " ");
}
}
}
예제 입력:
5 3
1 2
3 4
1 5
예제 출력:
5 3 4 1 2
코드 설명
- 핵심 알고리즘: 배열의 일부 구간을 선택하여 반복문을 통해 해당 구간의 순서를 뒤집습니다.
- 구현 세부사항:
- 초기화 단계에서 배열
arr
는 1번부터 N번까지 채워집니다. - 각 작업에서 시작 번호
a
와 끝 번호b
가 주어지면, 해당 구간의 앞뒤 요소를 반복적으로 교환하여 뒤집기를 구현합니다. - 최종적으로 배열의 상태를 출력합니다.
- 초기화 단계에서 배열
- 시간 복잡도 분석:
- 초기화 단계: O(N)
- 뒤집기 작업: O(M * K), 여기서 K는 뒤집기 구간의 평균 크기
- 결과 출력: O(N)
- 총 시간 복잡도: O(N + M * K)
결과
코드는 정확히 M번의 뒤집기 작업을 수행한 후, 바구니의 최종 상태를 출력합니다. 배열 조작과 구간 반전 작업을 연습하기에 적합한 문제입니다. 추가적인 질문이나 개선 사항이 있다면 댓글로 알려주세요!
728x90
LIST
'BAEKJOON > 구현' 카테고리의 다른 글
백준 5622번 [다이얼](JAVA)-yes6686- 티스토리 (0) | 2025.01.15 |
---|---|
백준 18808번 [스티커 붙이기](C++) -yes6686- 티스토리 (0) | 2025.01.12 |
백준 10813번 [공 바꾸기](JAVA) -yes6686- 티스토리 (0) | 2025.01.08 |
백준 1855번 [암호](C++) -yes6686- 티스토리 (0) | 2025.01.07 |
백준 2239번 [스도쿠](C++) -yes6686- 티스토리 (0) | 2025.01.04 |