본문 바로가기
알고리즘/c++ 프로그래머스

[프로그래머스] 숫자의 표현 c++

by 말린밴댕이_공부 2023. 5. 3.
반응형

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/12924

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

코드 및 풀이

첫 코드

/*
연속된 숫자의 합이니깐 반복문을 돌때 j가 i일때부터 n을 넘기기 전까지 넘긴다면 애초에 말이 안되는거니깐
근데 만약에 j = n이면 이탈하는거로 결정

그리고 숫자의 반 + 1까지만 돌아도 됨
ex)
10000 -> 5000 + 5001을 하면 애초에 이탈임
9999 -> 4999 + 5000하면 딱 맞음

*/
#include <string>
#include <vector>

using namespace std;

int solution(int n) {
    int answer = 0;
    for(int i = 1; i < (n/2) + 1; i++){
        int j = i;
        int sum = 0;
        while(j<n){
            sum += j;
            if(sum == n){ //숫자가 맞으면 진행
                answer++;
                break;
            }
            j++;
        }
    }
    answer++; //만약 10000이라면 5000까지 돌았으니 10000은 되는거니깐
    return answer;
}

이렇게 하니 다 맞았는데 틀렸다고 효율성에서 다 틀렸다고 나왔다

 

내가 뭘 잘못한거지? 나누기 2까지하면서 쓸데없는 시간을 낭비하지 않았다고 생각하는데?

 

이렇게 했더니 다 맞았지만 시간 초과가 떴다 문제에서 요구하는 것이랑 너무 하찮게 접근했나보다.

 

그는 바보가 맞다.

/*
연속된 숫자의 합이니깐 반복문을 돌때 j가 i일때부터 n을 넘기기 전까지 넘긴다면 애초에 말이 안되는거니깐
근데 만약에 j = n이면 이탈하는거로 결정

그리고 숫자의 반 + 1까지만 돌아도 됨
ex)
10000 -> 5000 + 5001을 하면 애초에 이탈임
9999 -> 4999 + 5000하면 딱 맞음
*/
#include <string>
#include <vector>
#include <iostream>

using namespace std;

int solution(int n) {
    int answer = 0;
    for(int i = 1; i < (n/2) + 1; i++){
        int j = i;
        int sum = 0;
        while(j<n){
            sum += j;
            if(sum == n){ //숫자가 맞으면 진행
                cout<<j;
                answer++;
                break;
            }else if(sum > n)
                break;
            j++;
        }
    }
    answer++; //만약 10000이라면 5000까지 돌았으니 10000은 되는거니깐
    return answer;
}

 

sum > n일때 break를 안걸어줬다 바보. 잠시 앉아서 1분동안 쳐다봤는데 이런 실수를 하다니.

반응형

댓글