문제

풀이코드
public int solution(int n) {
int answer = 1; //답
int sum = 0; //합
int lt = 1; //왼쪽 끝
int rt = 2; //오른쪽 끝
int length = (n/2)+1; //주어진 숫자의 반값
if(n == 1){ //n이 1일때, 1반환
return answer;
}else{ //n이 1보다 클때,
sum = lt+rt; //lt+rt값을 초기 sum으로 지정
while(lt != length || rt > length){ //반복문의 탈출 조건
if(sum >= n){ //sum이 n보다 클 때,
if(sum == n){ //sum이 n과 같은지 확인한 후,
answer++; //답의 갯수 1개 증가
}
sum -= lt; //그리고 sum에서 lt값을 빼고 1개 증가 시킴
lt++;
}else{ //sum이 n보다 작을 때,
rt++; //rt값을 1개 증가시킴
sum += rt; //sum에 rt를 더함.
}
}
}
return answer;
}
처음의 풀이 코드는 이것이었다.
간단히 코드를 설명하자면 123456789이런식으로 있다고 칠때, lt를 왼쪽 끝(1), rt를 오른쪽 끝(2)으로 잡아서
그 사이 수들을 다 더하고 만약에 더한 값이 n보다 크면 lt를 오른쪽으로 한번(2)옮겨서 다시 더한 값을 계산하고
이런식으로 찾는 코드인데 이게 풀기는 이렇게 풀었는데 그냥 for문 2번 쓰면 더 빨리 풀릴 것 같아서 다시 풀어보았다.
하지만 for문을 2번 쓰니 속도도 너무 느려지고 효율성도 너무 떨어져서 그냥 위의 방법대로 풀었다.
왠만한 것은 다 주석에 설명을 달아놓았으나 length를 저렇게 지정한 이유는
어떤 수를 더해서 n을 만든다고 할 때, n의 반값과 그 다음 값(n/2 + 1)을 했을 때가 최대한 적게 더하고
최대한 n에 가깝게 값이 나오므로 length의 값을 저렇게 설정했다.
'프로그래머스 > Level 2' 카테고리의 다른 글
| [프로그래머스][Level2][Java] 다음 큰 숫자 (0) | 2022.03.11 |
|---|---|
| [프로그래머스][Level2][Java] 땅따먹기 (0) | 2022.03.10 |
| [프로그래머스][Level2][Java] 최솟값 만들기 (0) | 2022.03.07 |
| [프로그래머스][Level2][Java] 피보나치 수 (0) | 2022.03.07 |
| [프로그래머스][Level2][Java] 행렬의 곱셈 (0) | 2022.03.07 |