일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 병행성
- Direct12
- 다이나믹프로그래밍
- 다이나믹 프로그래밍
- 알고리즘
- 그리디 알고리즘
- 디자인패턴
- OS
- 스케줄링
- 파일시스템 구현
- 운영체제
- 타입 객체
- codility
- 그리디알고리즘
- 컨디션 변수
- 자료구조
- I/O장치
- 쓰레드
- DirectX 12
- 프로그래머스
- DirectX12
- 백준
- 락
- directx
- 영속성
- 병행성 관련 오류
- 동적계획법
- 멀티쓰레드
- 멀티프로세서
- 렌더링 파이프라인
Archives
- Today
- Total
기록공간
숫자의 표현 (프로그래머스) - Java 본문
반응형
해결 방법
동적계획법을 사용해볼 생각을 해봤지만 전혀 접근방법이 안떠올랐다. 한참을 고민했지만 그저 정직하게 풀면 풀리는 문제였다.
sum이라는 변수에 1부터 시작해서 차례대로 n이 될때까지 더해준다. 만약 sum이 n이 된다면 그것은 연속한 자연수들로 표현할 수 있는 방법이므로 result를 하나 증가시킨다. 만약 sum이 n을 넘어가면 표현 불가능한 방법으로 다음 시작점부터 시작하면 된다. 이 작업은 시작점을 1에서부터 n / 2까지 진행하면 된다. n / 2까지만 진행하는 이유는 그 이후 숫자들을 시작점으로 놓으면 어떤 경우라도 sum이 n을 넘어가기 때문이다. n / 2까지만 진행하므로 한 숫자(n 자기자신)로 표현하는 방법은 따로 생각해줘야 하므로 result를 1부터 시작한다.
n = 15
result = 1 -> i가 15인 경우 (15 = 15)는 미리 생각해준다.
i = 1
1 + 2 + 3 + 4 + 5 = 15 -> 표현가능 -> result = 2
i = 2
2 + 3 + 4 + 5 + 6 > 15 -> 표현불가능 -> result = 2
i = 3
3 + 4 + 5 + 6 > 15 -> 표현 불가능 -> result = 2
i = 4
4 + 5 + 6 = 15 -> 표현가능 -> result = 3
i = 5
5 + 6 + 7 > 15 -> 표현불가능 -> result = 3
i = 6
6 + 7 = 15 -> 표현가능 -> result = 4
i = 7 -> 15 / 2 = 7 이므로 i는 여기까지만 실행
7 + 8 > 15 -> 표현불가능 -> result = 4
result = 4
구현 코드는 다음과 같다.
class Solution {
public int solution(int n) {
int answer = 1;
for(int i = 1; i <= n / 2; ++i) {
int sum = 0;
int count = i;
while(sum < n) {
sum += count++;
if(sum == n) {
++answer;
break;
}
}
}
return answer;
}
}
반응형
'Algorithm > 문제' 카테고리의 다른 글
소수 만들기 (프로그래머스) - Java (0) | 2020.08.25 |
---|---|
N개의 최소공배수 (프로그래머스) - Java (0) | 2020.08.25 |
소수 찾기 (프로그래머스) - Java (0) | 2020.08.22 |
최대공약수와 최소공배수 (프로그래머스) - Java (0) | 2020.08.22 |
키패드 누르기 (2020 카카오 인턴쉽) (0) | 2020.08.20 |
Comments