-
백준 : 회전하는 큐코딩테스트 문제 풀이/백준 2023. 11. 20. 00:01
문제
내 코드
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); int N = st.hasMoreTokens() ? Integer.parseInt(st.nextToken()) : 0; int M = st.hasMoreTokens() ? Integer.parseInt(st.nextToken()) : 0; st = new StringTokenizer(br.readLine()); // cnt : 총 이동 횟수 저장할 변수 int cnt = 0; // want : 찾아야 할 숫자를 저장할 변수 int want; // Queue 역할을 할 list ArrayList<Integer> list = new ArrayList(); // list는 Q의 길이만큼 초기화 while (list.size() < N) { // cnt 잠시 빌려 사용 list.add(++cnt); } // cnt 초기화 cnt = 0; // 다음 원하는 숫자를 찾을 때 까지 반복 while (st.hasMoreTokens()) { // want = 찾고 싶은 문자 저장 want = Integer.parseInt(st.nextToken()); // wnat가 list의 첫번째 값과 같다면 // 조건 1에 해당하기 때문에 그냥 삭제 if (want == list.get(0)) { list.remove(0); // 아래 실행문들 실행하지 않고 while 조건문으로 돌아감 continue; } // 찾으려는 숫자의 인덱스 위치가 // (리스트 크기-찾으려는 숫자의 인덱스 번호)보다 크면 // 큐의 뒷부분에 위치하고 있는것이기 때문에 if문 타고 뒤에서 부터 탐색 if (list.size() - list.indexOf(want) < list.indexOf(want)) { // 뒤의 값 앞으로 이동 // 처음 이동시 뒤로 거꾸로 이동하기 때문에 counting 되어야함 cnt++; // 원하는 값을 찾을 때 까지 while문 반복 while(list.get(list.size() - 1) != want) { // 뒤의 값을 앞으로 이동시키기 위한 add( ) list.add(0, list.get(list.size() - 1)); // 맨 마지막 값을 맨 앞으로 옮겼으니 삭제해줌 list.remove(list.size() - 1); // 이동이 일어났으므로 cnt+=1 cnt++; } // want값을 지워야 하기때문에 삭제 list.remove(list.size() - 1); } else { // 앞의 값 뒤로 이동 while(list.get(0) != want) { // 맨 처음에 있는 값을 맨 뒤로 이동 list.add(list.size(), list.get(0)); // 맨 앞에 있는 값은 옮겨진걸로 되어야해서 지움 list.remove(0); // 이동이 일어났으므로 cnt+=1 cnt++; } // want값을 지워야 하기 때문에 삭제 list.remove(0); } } System.out.println(cnt); } } '코딩테스트 문제 풀이 > 백준' 카테고리의 다른 글
행성 X3 (0) 2023.11.21 백준 : 힙 정렬2 (0) 2023.11.21 백준: 요세푸스 문제 (0) 2023.11.20 백준: 최소, 최대 (0) 2023.11.20 백준 25556번 : 포스택 (0) 2023.11.20