문제 풀이 및 개발 공간

[백준] 2635번 수 이어가기 문제! (silver 5 본문

백준공부/java

[백준] 2635번 수 이어가기 문제! (silver 5

gomduri43 2022. 7. 31. 20:53

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

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));
		int n=Integer.parseInt(br.readLine());
		int before=0;  //이전의 수 개수
		int wantN=0;  //원하는 2번째 수의 값
		int num1;   
		int num2;    
		int num3;   
		int count=0; //개수 세기
		for(int secondN=1; secondN<=n; secondN++) {
			num1=secondN;;  
			num2=n-secondN; 
			num3=0;
			count=3; //n, secondN,n-secondN; 총 3개를 구한 것이므로
			while(true) {
				num3=num1-num2;
				num1=num2;
				num2=num3;
				count++; //이부분
				if(num2<0) {
					count--; //num2가 0보다 작게 만드는 과정에서 count++됐으므로 --
					break;
				}
			}	
			if(count>before) {
				before=count;
			}//규칙을 보면 2번째 수의 값이 1에서부터 커질때, 
            //n/2를 기점으로 수가 점점 커지다가 일정 수부터 다시 작아진다.
            //따라서, 현재의 수의 개수가 전보다 클때는 계속 시행하다가,
			else if(before>count){	
				wantN=secondN-1;
				break;
			}//현재의 수의 개수가 전보다 작아지면, 이제 수의 개수가
            //줄어드는 시점에 진입한것이므로, break를 통해 탈출한다. 
			else {
				continue;
			}
		}
		wantN= n==1 ? 1:wantN;//이 부분에서 100%에서 틀렸다로 채점되었다.
        //위의 수를 구하는for문에서, 만약 n이 1일 경우에 
        //for문에서 else if 가 아닌 if문을 통과하고, 이럴경우 wantN에 원하는 값을
        //대입시키지 못한다. 따라서, 그럴 경우를 잡아준다.
        //만약 for문안에서, else문뒤에, wantN=secondNd이런식으로 작성하면,
        //위의 조건문이 필요없지만, secondN의 모든 경우에서 그런작업을 실시하기 보다는
        //한번의 조건식으로 판단해서 저장하는 것이 효율적이라 판단되었다. 
		bw.write(before+"\n");
		bw.write(n+" "+wantN);
		num1=n;
		num2=wantN;
		while(true) {
			num3=num1-num2;
			num1=num2;
			num2=num3;
			if(num2>=0) {
				bw.write(" "+num2);
			}
			else {
				break;
			}
		}	
		bw.flush();
		
		
		
	}
}