바구니 뒤집기 (10811) 풀이

2023. 6. 15. 09:45BaekJoon/1차원 배열

문제내용

사용자에게 바구니 개수 N과 테스트 개수 M, 시작번호 i, 끝 번호 j를 입력받아 바구니에서 I에서부터 J번째를 뒤집어서 넣어 마지막에 출력하는 문제이다.


풀이

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int n = Integer.parseInt(st.nextToken());
		int m = Integer.parseInt(st.nextToken());
		
		ArrayList<Integer> intArr = new ArrayList<Integer>();
		for(int i = 0; i < n; i++){
			intArr.add(i+1);
		}
		int count = 0;
		for(int cnt = 0; cnt < m; cnt++){
			st = new StringTokenizer(br.readLine());
			int i = Integer.parseInt(st.nextToken());
			int j = Integer.parseInt(st.nextToken());
			ArrayList<Integer> intArr2 = new ArrayList<Integer>();
			for(int cnt2 = i-1; cnt2 < j; cnt2++){
				intArr2.add(intArr.get(cnt2));
			}
			Collections.reverse(intArr2);
			for(int cnt3 = i-1; cnt3 < j; cnt3++){
				intArr.set(cnt3, intArr2.get(count));
				count++;
			}
			count = 0;
		}
		for(int i = 0; i < intArr.size(); i++){
			if(i==intArr.size()-1){
				bw.write(String.valueOf(intArr.get(i)));
			}else{
				bw.write(String.valueOf(intArr.get(i))+" ");
			}
		}
		bw.flush();
		bw.close();
	}
}

먼저 사용자에게 정수를 입력받기 위해 BufferedReader와 StringTokenizer를 사용해 n,m,i,j를 입력받았다.

코드가 조금 길기 때문에 차례대로 풀이해보겠다.

첫번째 for문에서는 바구니의 개수만큼 번호를 넣어준 로직이다. 

두번째 for문에서는 테스트 케이스 m번만큼 반복해 i,j를 입력받고 intArr에서 시작 i ~ 끝 j를 뽑아 intArr2에 넣어주었다.

Collections.reverse로 배열 데이터 앞 뒤를 뒤집었다. 뒤집은 배열을 i~j 인덱스에 넣어주었다.

마지막으로 데이터를 출력했다.


겪었던 문제

코딩을 하기 이전에 로직을 먼저 생각해보고 풀어야하는데 일단 짜고 보는 성격이라 반복횟수에서 일어나는 생각지 못한 상황이 일어난다던지 풀이가 잘못된 방향으로 흘러가는 문제가 종종 아니.. 매번 일어난다. 그렇기 때문에 클린코드는 고사하고 비효율적인 로직이 탄생한다. 어떻게하면 더 좋은 성능, 클린 코드를 짤 수 있는지 아직 감이 오지 않는다. 독자분들은 어떻게 코딩을 하시는지 공유해주시면 감사하겠다...

'BaekJoon > 1차원 배열' 카테고리의 다른 글

평균 (1546) 풀이  (0) 2023.06.15
나머지 (3052) 풀이  (0) 2023.06.14
과제 안 내신 분..? (5597) 풀이  (0) 2023.06.14
공 바꾸기 (10813) 풀이  (0) 2023.06.14
공 넣기 (10810) 풀이  (0) 2023.06.14