
문제

내 풀이 1 : 예제 탈락 - 접근 오류
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main extends Exception {
public static void main(String[] args) throws IOException {
// 자연수 합을 구하는 갯수가 많아야 하므로 1부터 더해준다.
// S를 초과할 경우, 1부터 순차적으로 빼준다.
// S보다 작아질 경우, 다시 1부터 더해준다.
// 순서를 조작해야하므로 Deque를 써보자!
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
long num = Long.parseLong(br.readLine());
long count = 0;
long sum = 0;
while (true) {
if (sum == num) {
break;
} else {
for (long i = 1; sum < num; i++) {
sum += i;
count++;
if (sum == num) {
break;
}
}
for (long i = 1; sum > num; i++) {
sum -= i;
count--;
if (sum == num) {
break;
}
}
}
}
System.out.println(count);
}
}
내 풀이 2 :
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main extends Exception {
public static void main(String[] args) throws IOException {
// 자연수 합을 구하는 갯수가 많아야 하므로 1부터 더해준다.
// S와 같으면 그냥 count 출력한다
// S보다 커지면 count -1하고 출력한다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
long num = Long.parseLong(br.readLine());
long count = 0;
long sum = 0;
for (int i = 1; sum < num; i++) {
sum += i;
count++;
if (sum > num){
count--;
break;
}
}
sb.append(count);
System.out.println(sb.toString());
}
}
느낀점
이 문제가;;; 너무 어려웠다;;
처음에는 디큐를 쓸까도 생각했었는데.. 설계하다 보니까 디큐를 쓸 필요가 없어서 뺐다.
그 다음 접근법으로는
1. 1부처 순차적으로 더한다. sum이 num보다 같거나 커질때 까지.
2. sum이 num보다 커지는 순간, 다시 1부터 빼준다.
3. sum이 num보다 작아지는 순간, 다시 1부터 더해준다.
4. 반복하면 sum이 num과 같아진다. 그 때 갯수를 세준다.
이렇게 접근하니까 답도 틀리고 너무 어려웠다. 도대체 이게 문제 난이도가 이게 맞나?
문제는 개어려운데 2초를 주니까 일단 풀어보라는걸까? 싶었다. 근데도 못풀었다..
다시 설계하니까 난이도에 맞게 설계를 했다.
나는 이 문제를 풀면서 내가 실력이 너무 없는것 같아서 조금 좌절했는데
그냥 너무 어렵게 생각했던 것 같다!