본문 바로가기

알고리즘

프로그래머스[1292] - 숫자의 표현 (lv2)

반응형

 

문제해결은 여기서!

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

 

프로그래머스

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

programmers.co.kr


문제설명

더보기

Finn은 요즘 수학공부에 빠져 있습니다. 수학 공부를 하던 Finn은 자연수 n을 연속한 자연수들로 표현 하는 방법이 여러개라는 사실을 알게 되었습니다. 예를들어 15는 다음과 같이 4가지로 표현 할 수 있습니다.

  • 1 + 2 + 3 + 4 + 5 = 15
  • 4 + 5 + 6 = 15
  • 7 + 8 = 15
  • 15 = 15

자연수 n이 매개변수로 주어질 때, 연속된 자연수들로 n을 표현하는 방법의 수를 return하는 solution를 완성해주세요.

제한사항

  • n은 10,000 이하의 자연수 입니다.

입출력 예

nresult
15 4

입출력 예 설명

입출력 예#1
문제의 예시와 같습니다.


※ 공지 - 2022년 3월 11일 테스트케이스가 추가되었습니다.

문제해결keyPoint

  1. 뭐냐.. 전혀 감이 안잡히네...
  2. 연속된 수가 1씩 차이난다. -> 완전탐색?..
  3. 수학적 지식이 필요하다.

20220915 1차시도

더보기

잠깐 고민하닥.. 카페시간이 다되서 쫓겨났다. 다시 고민해보려 했으나 귀차니즘으로 하지 못함 ㅎ 풀이나 보자... ㅠㅠㅠㅠㅠ

class Solution {
    public int solution(int n) {
/**
         * 1. 등차수열의 합 공식을 이용해보자.
         *  -> 등차수열의 합 = n * (i+p[n])/2 (i는 순열의 첫항, n은 마지막항이다, p[n]은 마지막 항의 숫자다.)
         *  -> 문제에서는 연속한 수이므로 등차가 1인 등차수열이다.
         *  -> 즉, 마지막항의 값과 마지막항이 같다.
         *
         * 2. 이것도 뭔가 DFS로 풀수 있을것 같은데?...
         */
        int answer = 0;
        for(int i=1; i<n; i++){
            if(i == 2*i-1){
                answer++;
            }
        }
        return answer;
    }
}

20220915 풀이참고

더보기

이건... 내가 딱? 고민하던 풀이방법이었는데, 예전 테스트 케이스에서 통과되어 나와있어 올린다... 이정도라도 해볼수 있었는데 너무 아쉽군...

class Solution {
    public int solution(int num) {
/**
         * 1. 등차수열의 합 공식을 이용해보자.
         *  -> 등차수열의 합 = n * (i+p[n])/2 (i는 순열의 첫항, n은 마지막항이다, p[n]은 마지막 항의 숫자다.)
         *  -> 문제에서는 연속한 수이므로 등차가 1인 등차수열이다.
         *  -> 즉, 마지막항의 값과 마지막항이 같다.
         *
         * 2. 이것도 뭔가 DFS로 풀수 있을것 같은데?...
         */
         int answer = 0;

    int sum;
    for(int i = 1 ; i <= num ; i++) {
      sum = 0;
      for(int j = i ; j <= num ; j++) {
        sum += j;
        if(sum == num) {
          answer++;
          j = num+1;
        }
      }
    }

        return answer;    
    }
}
정확도라도 맞출수 있었는데... ㅠㅠ

20220915 풀이참고 2번째

더보기

놀랍게도 break문만 걸어줘도 통과할 수 있다. ㄷㄷ... 정말 내가 생각했던 거랑 똑같네.. for문이 두개들어가서 걍 실패 뜰줄 알았는데 ㅋㅋㅋ 

class Solution {
    public int solution(int num) {
/**
         * 1. 등차수열의 합 공식을 이용해보자.
         *  -> 등차수열의 합 = n * (i+p[n])/2 (i는 순열의 첫항, n은 마지막항이다, p[n]은 마지막 항의 숫자다.)
         *  -> 문제에서는 연속한 수이므로 등차가 1인 등차수열이다.
         *  -> 즉, 마지막항의 값과 마지막항이 같다.
         *
         * 2. 이것도 뭔가 DFS로 풀수 있을것 같은데?...
         */
         int answer = 0;

    int sum;
    for(int i = 1 ; i <= num ; i++) {
      sum = 0;
      for(int j = i ; j <= num ; j++) {
        sum += j;
        if(sum == num) {
          answer++;
          j = num+1;
            break;
        }
        if(sum>num){
            break;
        }
      }
    }

        return answer;    
    }
}

 

반응형