본문 바로가기
백준

[백준] 단계별로 풀어보기(단계:8,기본수학1,JAVA)1193번, 분수찾기

by 열정적인 이찬형 2021. 12. 29.

문제 링크

1193번: 분수찾기
 
www.acmicpc.net
 

주의사항

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

문제 설명


접근 방법

  • BufferedReader를 사용하여 입력 값을 받았습니다.
  • 분수를 찾는 findFractional과 홀수,짝수를 구분하는 odd_even_number 함수를 구현하였습니다.
  • 분수 범위가 1씩 증가하기 때문에 start에 1씩 더하여 입력값이 속해있는 범위를 찾았습니다.
  • 범위를 찾은 후 시작하는 방향을 구하기 위해 stack이 홀수이면 위로 짝수이면 아래로 되도록 하였습니다.
  • 방향에 맞게 분모와 분자에 값을 더하고 빼서 분모를 구하여 결과를 도출하였습니다.
  • findFractional함수에 결과를 result에 받았습니다.
  • result bw에 저장하였습니다.
  • BufferedWriter를 통해 저장된 결과를 출력하였습니다.

결과 코드

import java.util.*;
import java.io.*;
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
        long num = Integer.parseInt(br.readLine());		//입력값 저장
        String result = findFractional(num);			//함수 결과값 받기
        bw.write(result + "\n");				//결과 bw에 저장
        bw.flush();						//결과 출력
        bw.close();
        br.close();
    }
    public static String findFractional(long num) {		//분수 찾기 함수
    	long plus = 2,start = 1,temp;				//범위 더하는 값, 비교 값, 임시 값
    	int stack = 1,molecules,denominator;			//시작 분수, 분자, 분모
    	boolean check;						//시작하는 방향 체크
    	String result="";					//결과값 반환 변수
    	if(num==1)
    		return "1/1";					//1/1일때 그대로 반환
    	else {
    		for(;;) {					//무한 반복함수
    			temp = start;
    			start+=plus;
    			stack++;
    			if(num<=start) {//입력 값 범위 안에 있을 때 무슨 분수를 가지는지 도출
    				check = odd_even_number(stack);
    				temp = num - temp;
    				if(check) {
    					molecules = 1;
    					denominator = stack;
    					for(int i=1;i<temp;i++) {
    						molecules++;
    						denominator--;
        				}
    				}else {
    					molecules = stack;
    					denominator = 1;
    					for(int i=1;i<temp;i++) {
    						molecules--;
    						denominator++;
        				}
    				}
    				break;
    			}
    			plus++;
        	}
    	}
    	result = String.valueOf(molecules) + "/" + String.valueOf(denominator);		//결과 String형
    	return result;						//결과 반환
    }
    public static boolean odd_even_number(int num) {		//홀수, 짝수로 방향 정하는 함수
    	if(num%2==0)
    		return true;
    	else
    		return false;
    }
}

댓글