
시험기간이 끝나고 며칠간 휴식 기간을 가졌다
이 기간이 끝나면 정말 열심히 달려보자고 다짐을 그렇게 해놓고 한 2~3일은 그냥 보내버렸다
시험이 끝났으니 이래도 된다는 핑계를 뱉으며.
이제 다시 달려보련다!

정말 다행인 것은 내가 매일 코테 문제를 풀었는지 확인하는 Solve.ac가 오전 6시에 날짜를 반영한다는 것이다
덕분에 12시를 넘겨도.. 새벽에 문제를 풀어도 인식이 잘 되어서 매번 자기 전에 풀고 자면 되니까
기록을 유지할 수 있다 !
정수 N이 주어졌을 때, 소인수분해하는 프로그램을 작성하시오.
간단한 문제이지만, 생각은 조금 오래 걸렸다. 조금 더 시간 복잡도를 줄일 수 있지 않을까하는 아쉬움이 남는다.
int i = 2;
while (N != 1) {
if (N%i == 0) {
System.out.println(i);
N = N/i;
i = 1;
}
i += 1;
}
1은 소수가 아니므로 이를 제외시키고 N의 크기를 나누어지는대로 줄여가며 출력하는 방식으로 구현하였다.
어떤 숫자 n이 자신을 제외한 모든 약수들의 합과 같으면, 그 수를 완전수라고 한다.
예를 들어 6은 6 = 1 + 2 + 3 으로 완전수이다.
n이 완전수인지 아닌지 판단해주는 프로그램을 작성하라.
while (true) {
int N = Integer.parseInt(br.readLine());
String str = "";
int sum = 0;
if (N == -1) {
break;
}
for (int i=1; i<=N/2; i++) {
if (N%i == 0){
sum += i;
if (str == "") {
str += i;
}
else {
str += " + " + i;
}
}
}
if (N == sum) {
System.out.println(N + " = " + str);
}
else {
System.out.println(N + " is NOT perfect.");
}
처음에 약수의 합과 약수들을 동시에 띄우야한다는 걸 보았을 때는 매우 당황하였다.
그러나, 그냥 인수 두개에 각각 받으면 된다는 걸 깨닫고 문제를 쉽게 접근할 수 있게 되었다.
또, 이번 문제를 풀면서 str == ""(해당 문자열이 비어있을 때)이라는 조건을 분류해서 문제를 풀게 되었는데 이렇게 한 까닭은 그존의 코드에서 이를 하나의 조건문에 넣다보니 모든 조건문에 반복되는 내용의 조건이 들어가서 코드의 가독성을 해친다고 생각했기 때문이다.
오늘도 서준이는 점근적 표기 수업 조교를 하고 있다. 아빠가 수업한 내용을 학생들이 잘 이해했는지 문제를 통해서 확인해보자.
알고리즘의 소요 시간을 나타내는 O-표기법(빅-오)을 다음과 같이 정의하자.
O(g(n)) = {f(n) | 모든 n ≥ n0에 대하여 f(n) ≤ c × g(n)인 양의 상수 c와 n0가 존재한다}
이 정의는 실제 O-표기법과 다를 수 있다.
함수 f(n) = a1n + a0, 양의 정수 c, n0가 주어질 경우 O(n) 정의를 만족하는지 알아보자.
if ((a1*n0+a0) <= c*n0 && c >= a1){
System.out.print(1);
}
else {
System.out.print(0);
}
꽤나 오랜 시간 나를 괴롭혔던 이 문제는 c>=a1이라는 것을 추가하지 않았기 때문에 생긴 문제이다.
같은 차항의 식을 가지고 있는데 기울기가 각각 c,a1이라는 기울기를 가졌을 때, 만약 c가 a1보다 작다면 기존세워져있는 (a1n0+a0) <= cn0 이라는 조건이 붕괴될 수 있기 때문이었다.
즉, 굉장히 간단한 문제였지만 수학적 논리를 생각을 안했기에 오랜 시간을 들이게 되었던 것이었다.
시험기간도 끝나고 해서 꽤 오랜 시간 동안 놀기도 하고 코테 문제도 제대로 풀지 않았던 거 같다.
특히, 개발도 시작해야하는데 이것도 잠깐 쉬어가고 있다..
이번 방학을 알차게 보내자고 마음 먹은 만큼 더욱 열심히 달려보겠다..!

더 빠르게 풀어보자 !