본문 바로가기

Algorithm/Brute Force

(C++) - 백준(BOJ) 17618 : 신기한 수

반응형

https://www.acmicpc.net/problem/17618

 

17618번: 신기한 수

평소에 수에 대한 관심이 많은 아이인 민철이는 오늘도 노트에 연필로 수를 더하거나 빼거나 곱하거나 나눠보면서 시간을 보내고 있다. 그러다가 18이라는 수는 신기한 성질을 가진다는 것을 알

www.acmicpc.net

모든 수를 검사하는 brute force로 푼 문제였습니다.

📕 풀이방법

📔 입력 및 초기화

범위 n, 정답을 출력할 ans를 선언한 뒤 n을 입력해줍니다.

📔 풀이과정

n이 최대 1천만이므로 1초 이내로 정답을 맞출 수 있었습니다.

1. n만큼 for문을 돌며 또 for 문을 수행할 수 있습니다. 각 자릿수는 최대 8자리이기 때문입니다. 따라서 for문을 수행해서 합을 구했습니다. 그 값을 지역변수 sum을 선언해 저장합니다.

2. 합을 구한뒤 현재의 수에 sum을 나누었을 때 나누어 떨어진다면 ans++해줍니다.

 

* c++에서의 시간복잡도 계산을 python에서 어떻게 해야하는지 모르겠으나 비슷한 code인데도 부분점수밖에 받지 못했는데 이유를 아직 찾지 못했습니다. 혹시 아시는 분 아래 python code를 올려두었으니 알려주시면 감사하겠습니다. ㅜㅜ

📔 정답출력

ans를 출력해줍니다.


📕 Code

#include <bits/stdc++.h>
using namespace std;
int n, ans;
int main(){
    cin >> n;
    for(int i = 1; i <= n; i++){
        string stringN = to_string(i);
        int sum = 0;
        for(int j = 0; j < stringN.size(); j++){
            sum += stringN[j] - '0';
        }
        if(i % sum == 0) ans++;
    }
    cout << ans;
}

 

맞왜틀 code

import sys
input = sys.stdin.readline
n = int(input())
num = int(n)
ans = 0
for num in range(1, n+1):
    sum = 0
    stringN = str(num)
    lenN = len(stringN)
    for j in range(lenN):
        sum += int(stringN[j])
    if(num % sum == 0): ans+=1
print(ans)