◇ 문제 설명
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 이하의 자연수 입니다.
◇ 입출력 예시
| n | result |
| 15 | 4 |
◇ 초기 내용
※ [출처] 프로그래머스-코딩테스트 연습-문제명
※ 초기 내용을 참고하여 문제에 맞는 코드를 작성하세요.
class Solution {
public int solution(int n) {
int answer = 0;
return answer;
}
}
◇ 풀이 과정
문제의 풀이과정은 이러했다.
- 연속적인 수의 기준점을 잡을 변수를 for반복문을 이용하여 반복
- 중첩 for문을 이용하여 위에서 선언한 변수에서 n까지 반복
- 누적합을 구하기 위해 sum변수 생성 후 연속적인 수의 누적합 구하기
- 그 누적합이 n과 같으면 answer +1
- 누적합이 answer보다 크면 이후 값들은 절대 n값이 될 수 없으므로 break문을 이용하여 효율성 향상
◇ 참고 사항
첫번째, 효율성
- break문을 이용하여 효율성을 향상시켰다.
- 효율성이 낮은 코드의 실행과정
class Solution { public int solution(int n) { int answer = 0; for(int i = 1; i<=n; i++){ int sum = 0; for(int j = i; j<=n; j++){ sum+=j; if(sum==n) answer++; } } return answer; } }
더보기더보기i = 1일때,
i = 2일때,idx 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 sum 1 3 6 10 15 21 28 36 45 55 66 78 91 105 120
i = 3일때,idx 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 sum - 2 5 9 14 20 27 35 44 54 65 77 90 104 119
i = 4일때,idx 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 sum - - 3 7 12 18 25 33 42 52 63 75 98 102 117
i = 5일때,idx 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 sum - - - 4 9 15 22 30 39 49 60 73 95 99 114
idx 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 sum - - - - 5 11 18 26 35 45 56 68 81 95 110 - 효율성이 높은 코드의 실행과정
class Solution { public int solution(int n) { int answer = 0; for(int i = 1; i<=n; i++){ int sum = 0; for(int j = i; j<=n; j++){ sum+=j; if(sum==n){ answer++; break; } else if(sum > n){ break; } } } return answer; } }
두번째, break문
- 반복문을 빠져나가기 위한 코드
- break문 사용시, 반복 문장을 실행하지 않고 반복문 밖의 문장으로 빠져나간다.
- 실행과정
ex. 반복문 10회 반복
for(int i = 1; i<=10; i++){ System.out.println(i); }
출력결과 1
2
3
4
5
6
7
8
9
10
ex. 반복문 10회 반복(단, i가 5일때 break)
for(int i = 1; i<=10; i++){ System.out.println(i); if(i==5) break; }
출력결과 1
2
3
4
5
◇ 답안
더보기
더보기
class Solution {
public int solution(int n) {
int answer = 0;
//1~n까지 반복문 실행
for(int i = 1; i<=n; i++){
//누적합을 구할 변수 선언
int sum = 0;
//연속된 숫자의 누적합을 구할 반복문
for(int j = i; j<=n; j++){
//누접합 구하기
sum+=j;
//만약, 누적된 합이 n과 같으면 answer +1
//이후 sum에 누적되는 값들은 n보다 크기때문에 체크할 필요가 없으므로
//break문을 사용하여 반복 멈춤으로써 효율성 향상
if(sum==n){
answer++;
break;
}
//연속적인 누적합이 만들어지지 않는 수들에 관해서도
//누적된 값이 n보다 크면 break문 사용하여 효율성 향상
else if(sum > n){
break;
}
}
}
return answer;
}
}
◇ 실행결과

◇ 효율성 테스트 결과

◇ 출처
https://programmers.co.kr/learn/challenges
코딩테스트 연습
기초부터 차근차근, 직접 코드를 작성해 보세요.
programmers.co.kr
'코딩테스트 > Java' 카테고리의 다른 글
| [Level2] 올바른 괄호 답안 및 풀이 (0) | 2021.12.28 |
|---|---|
| [Level2] 다음 큰 숫자 답안 및 풀이 (0) | 2021.12.27 |
| [Level2] 최댓값과 최솟값 답안 및 풀이 (0) | 2021.12.25 |
| [Level2] 최솟값 만들기 답안 및 풀이 (0) | 2021.12.24 |
| [Level2] 행렬의 곱셈 답안 및 풀이 (0) | 2021.12.23 |
댓글