https://www.acmicpc.net/problem/2635
2635번: 수 이어가기
첫 번째 수가 주어진다. 이 수는 30,000 보다 같거나 작은 양의 정수이다.
www.acmicpc.net
brute force로 해결한 문제였습니다.
📕 풀이방법
📔 입력 및 초기화
첫 번째 수 n, 가장 긴 수열의 길이 maxLength, 그 때의 수를 저장할 vector형 nums를 선언하고 n에 입력을 받습니다.
📔 풀이과정
두 번째 수는 선택할 양의 정수이므로 1 ~ n까지의 범위가 선택 가능합니다. n이 넘어가면 바로 세 번째 수가 음수가 되기 때문에 확인할 필요가 없습니다.
1. 1 ~ n만큼 for loop를 수행하며 두 번째 수를 지역변수 secondNum을 선언해 저장합니다.
1-1. 세 번째 수는 지역변수 nextNum를 선언해 n - secondNum값을 저장합니다.
1-2. 세 번째 수는 음수가 아니며 유효하므로 수열의 최소 길이는 3입니다. 이를 지역변수 length를 선언해 저장합니다.
1-3. vector v를 선언해 n, secondNum, nextNum를 저장합니다.
2. while loop를 수행합니다.
2-1. 이제 수를 nextNum이 음수일 때까지 계속 이어 가며 v에 원소를 저장하고 길이 length를 늘려줍니다.
3. loop 탈출 후 maxLength와 length를 비교해 이번 수열 길이가 더 길다면 정답이 될 수 있으므로 nums, maxLength를 갱신합니다.
📔 정답출력
maxLength와 nums의 원소들을 형식에 맞게 출력해줍니다.
📕 Code
#include <bits/stdc++.h>
using namespace std;
int n, maxLength;
vector <int> nums;
int main(){
    cin >> n;
    for(int i = 1; i <= n; i++){
        int secondNum = i;
        int nextNum = n - secondNum;
        int length = 3;
        vector<int> v = {n, secondNum, nextNum};
        while(1){
            int tmp = nextNum;
            nextNum = secondNum - nextNum;
            if(nextNum < 0) break;
            secondNum = tmp;
            length++;
            v.push_back(nextNum);
        }
        if(maxLength < length) nums = v, maxLength = length;
    }
    cout << maxLength << '\n';
    for(auto e : nums) cout << e << ' ';
}'Algorithm > Brute Force' 카테고리의 다른 글
| (C++) - 백준(BOJ) 14913 : 등차수열에서 항 번호 찾기 (0) | 2022.03.28 | 
|---|---|
| (C++) - 백준(BOJ) 3135 : 라디오 (0) | 2022.03.24 | 
| (C++) - 백준(BOJ) 17618 : 신기한 수 (5) | 2022.03.07 | 
| (C++) - 백준(BOJ) 1531 : 투명 (2) | 2022.02.22 | 
| (C++) - 백준(BOJ) 9094 : 수학적 호기심 (0) | 2022.02.13 |