본문 바로가기
백준

[백준] 단계별로 풀어보기(단계:8,기본수학1,JAVA)1011번, Fly me to the Alpha Centauri

by 열정적인 이찬형 2022. 1. 1.

문제 링크


주의사항

  • JAVA를 사용하여 프로그램을 사용하였습니다.
  • 백준에서 코드를 작성하였을 때 아래 형태에서 Main에서 결과가 출력되어야 합니다.
public class Main{ 	
	public static void main(String[] args){
    }
}

문제 설명


접근 방법

  • BufferedReader를 사용하여 입력 값을 받았습니다.
  • StringTokenizer를 통하여 입력값을 띄어쓰기 기준으로 나누었습니다.
  • 이동하는 최소값 구하는 함수 FlyMeToTheAlphaCentauri을 만들었습니다.
  • 반드시 마지막에는 거리를 1을 이동해야 한다는 뜻은 숫자가 증가해도 1까지는 내려와야 한다는 뜻이다.
  • 예를 들어 숫자가 4가 되면 4,3,2,1로 최소 거리가 10은 남아있어야 하므로 최소 값을 sum으로 저장하였습니다.
  • 계속 sumdistance를 비교하며 숫자를 올릴 수 있는지 없는지 확인하였습니다.
  • check를 통하여 숫자가 증가할 때와 감소할 때를 구분하여 계산하도록 하였습니다.
  • distancesum이 같을 때 거리는 최소거리이므로 숫자에서 곧바로 1까지 내려가므로 횟수에 num을 더하였습니다.
  • ex)distance가 10이 남았을 때 sum이 10이면 4,3,2,1로 수직적으로 내려간다.
  • 결과 bw에 저장하였습니다.
  • BufferedWriter를 통해 저장된 결과를 출력하였습니다.

결과 코드

import java.io.*;
import java.util.*;
public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        //입력 값을 받는 BufferedReader
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        //결과를 출력하는 BufferedWriter
        StringTokenizer st;
        int index = Integer.parseInt(br.readLine());			//반복 횟수
        for(int i=0;i<index;i++){					//변수 저장 및 함수 실행
            st = new StringTokenizer(br.readLine()," ");		//줄마다 띄어쓰기 기준 나누기
            int currentLocation = Integer.parseInt(st.nextToken());	//현재 위치
            int arrivalLocation = Integer.parseInt(st.nextToken());	//목표 위치
            int distance = arrivalLocation - currentLocation;		//거리
            int result = FlyMeToTheAlphaCentauri(distance);		//함수 실행
            bw.write(result + "\n");					//결과 bw에 저장
        }
        bw.flush();							//결과 출력
        bw.close();
        br.close();
    }
    public static int FlyMeToTheAlphaCentauri(int distance){	//최소값 계산 함수
        int result = 0, sum = 1, num = 1;	//횟수, 최소거리, 현재 숫자
        boolean check = true;			//숫자 올라가는지 내려가는지 확인
        for(;;){
            if(distance>sum && check){		
            //숫자 올라갈 때 거리가 최소거리보다 클 때
                distance -= num;
                num++;
                sum += num;
                result++;
            }else if(distance==sum){		//거리랑 최소거리와 같을 때
                result +=num;
                break;
            }else if(distance<sum && check){	
            //숫자 올라갈 때 거리가 최소거리보다 작을 때
                sum-=num;
                num--;
                check = false;
            }else if(distance>sum && !check){	
            //숫자 내려갈 때 거리가 최소거리보다 클 때
                distance -= num;
                result++;
            }else if(distance<sum && !check){	
            //숫자 내려갈 때 거리가 최소거리보다 작을 때
                sum-=num;
                num--;
            }
        }
        return result;		//결과 반환
    }
}

댓글