문제 풀이 및 개발 공간

[백준] 2828번 사과 담기 게임 문제! (silver 5 본문

백준공부/java

[백준] 2828번 사과 담기 게임 문제! (silver 5

gomduri43 2022. 7. 26. 13:14

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

public class Main {
	public static void main(String[] args) throws 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());
		int j=Integer.parseInt(br.readLine());
		int[] apple=new int[j];  //사과 개수에 따른 떨어지는 위치 저장
		int start=1;      //바구니는 m칸이므로 첫째칸의 위치
		int startToE=m-1; //바구니 길이는 m인데, 바구니 처음 위치는 start이므로 나머지 바구니길이 
		//사과 저장 //즉 start+ startToE= 바구니 전체 길이
        for(int i=0; i<j; i++) {
			apple[i]=Integer.parseInt(br.readLine());
		}
		int num=0;  //몇번째 사과인지,
		int move=0; //몇번 움직였는지 저장
		while(true) {
			//사과가 떨어지는 위치가, 바구니 처음 위치와 바구니 마지막 위치
            //안에 있으면 바구니 안에 떨어지는 것이므로 성공, 
            //이를 성공하였으므로, 다음번째의 사과를 호출하기 위해 num++
			//마지막 사과는 apple.length-1인데, 이를 성공하면 ++이되어, 
            //num==apple.length이 되므로, num==apple.length에서 break;
            if(apple[num]>=start && apple[num]<=(start+startToE)) {
				num++;
				if(num==apple.length) {
					break;
				}
			}
            //사과가 떨어지는 위치와, 바구니 시작점의 위치를 비교하며 바구니를 이동,
            //이때 바구니 첫 위치와, 마지막 위치 사이에 사과가 떨어지면, 바구니에 들어가는데
            //이는 if문에서 다 걸러주고, else로 넘어온 것들은 사과가 바구니에 떨어지지 않는 
            //경우가 넘어온 것이므로, 무조건 바구니를 이동해야 하는 상황이다.
            //이때 사과가 떨어지는 지점이 바구니 시작점 보다 크다는 것은 바구니의 오른쪽으로
            //떨어지는 것이므로, 바구니를 오른쪽으로 옮긴다. start++, move++;
            //이렇게 옮기면 다시 while문을 돌고, 변한 시작점과 마지막 점을 비교하며 바구니에
            //사과가 떨어지는지 판단, 만약 들어갔으면 if문에서 다음 사과를 호출하며 종료,
            //떨어지지 않았으면 다시 else문으로 와서 사과를 옮긴다.
            //사과가 떨어지는 위치가 start지점보다 작으면, 이는 바구니 왼쪽으로 떨어지므로,
            //이때는 바구니의 시작점을 왼쪽으로 --해준다. 이렇게 계속 이동을 하면서,
            //if문에서 사과가 안에 떨어지는지 잡아주고, 잡으면 다음번 사과 호출.,
            //떨어지지 않으면, else문에서 다시 이동을 실시한다.
			else {
				if(apple[num]>start) {
					start++;
					move++;
				}
				else if(apple[num]<start) {
					start--;
					move++;
				}
				else {
					continue;
				}
			}
		}
		System.out.println(move);
	}
}