long beforeTime = System.currentTimeMillis();
int sum = 0;
for (int i = 0; i < 1000000; i++) {
for (int j = 0; j < 50000; j++) {
sum += i*j;
}
}
long afterTime = System.currentTimeMillis();
long secDiffTime = (afterTime - beforeTime)/1000;
System.out.println("시간차이(m) : "+secDiffTime);
if(true) cout << k << '\n';
이 10*n^+ n
번 반복된다. (입력크기 n)for(int i = 0; i < 10; i++){
for(int j =0; j < n; j++){
for(int k = 0; k < n; k++){
if(true) cout << k << '\n';
}
}
}
for(int i = 0; i < n; i++){
if(true) cout << i << '\n';
}
10n^+n
⇒ O(n^)
n!+2^n
이라면 O(n!)
// 1. 입출력
// cin, cout, scanf, printf
for(int i = 0; i < 10; i++){
for(int j =0; j < n; j++){
for(int k = 0; k < n; k++){
if(true) cout << k << '\n'; // 이 부분은 O(1) (입출력)
}
}
}
n = 100 >> 10000000000 // 해도 입력크기와 상관없으므로
for(int i = 0; i < n; i++){
if(true) cout << i << '\n';
}
// 2. 곱하기, 나누기, 나머지연산, 빼기 등
a[2] *= 2;
// 3. 간단한 비교 if문
if(a[2] == 2)
// 4. 배열의 인덱스 참조
int a[3] = {1, 2, 3};
int b = a[2];
cnt 디버깅 하기 → 손코딩 → 그림
#include<bits/stdc++.h>
using namespace std;
int n, cnt;
int main(){
cin >> n;
int a = 0;
for(int i = 0; i < n; i++){
for(int j = 0; j < i; j++){
a += i + j; // 상수시간 이므로 얼마만큼 반복되는지가 척도
}
}
cout << a << '\n';
cout << "cnt : " << cnt << '\n'; // 반복 횟수 세기(디버깅)
return 0;
}
/*
n 3 4 5 6
cnt 3 6 10 15
<손코딩>
i = 1 -> j = 0
2 0,1
3 0,1,2
4 0,1,2,3
=> 그림으로 그려보자
*/
n^/2
(n^-n)/2
= cntO(n^)
#include<bits/stdc++.h>
using namespace std;
int N, M;
void solve(int N, int M){
int a = 1;
for (int i = 0; i < N; i++) {
a *= i;
}
for (int j = 0; j < M; j++) {
a *= j;
}
cout << a << "\n";
}
int main(){
cin >> N >> M;
solve(N, M);
return 0;
}
/*
for (int i = 0; i < N; i++) {
a *= i;
for (int j = 0; j < M; j++) {
a *= j;
}
}
이라면 nm
*/
/*
for (int i = 0; i < N; i++) {
a *= i;
for (int j = 0; j < N; j++) {
a *= j;
}
}
for (int i = 0; i < N; i++) {}
for (int i = 0; i < M; i++) {
a *= i;
for (int j = 0; j < M; j++) {
a *= j;
}
}
for (int i = 0; i < M; i++) {}
이라면 n^+n+m^+m
*/
n+m
n^+n+m^+m
⇒ O(n^+m^)
#include<bits/stdc++.h>
using namespace std;
int n, a[1004], cnt;
int go(int l, int r){
cnt++; // 디버깅
if(l == r) return a[l];
int mid = (l + r) / 2; // 상수시간 복잡도
int sum = go(l, mid) + go(mid + 1, r); // 상수시간 복잡도
return sum;
}
int main(){
cin >> n;
for(int i = 1; i <= n; i++){
a[i - 1] = i;
}
int sum = go(0, n - 1);
cout << sum << '\n';
cout << "cnt : " << cnt << "\n"; // 디버깅
}
/*
n = 5 -> cnt = 9
n = 10 -> cnt = 19
n = 20 -> cnt = 39
=> 2n-1
*/
O(n)
#include<bits/stdc++.h>
using namespace std;
int N, cnt;
void solve(int N){
int a = 0, i = N;
while (i > 0) {
a += i;
i /= 2;
cnt++;
}
cout << a << '\n';
cout << cnt << '\n';
}
int main(){
cin >> N;
solve(N);
return 0;
/*
n = 32 -> cnt = 6
16 5
8 4
=> (log2 n) + 1
*/
O(log2 n)
#include<bits/stdc++.h>
using namespace std;
int N, cnt;
void go(int N){
cnt++;
cout << cnt << '\n'; // 재귀 함수의 메인 로직
if(N == 0) return;
for(int i = 0; i < 3; i++){ // go함수 하나마다 3번 호출
go(N - 1);
}
return;
}
int main(){
cin >> N;
go(N);
return 0;
}
/*
n = 3 -> cnt = 40 (go함수의 호출 횟수)
*/
(3^n-1)/2
→ O(3^n)*O(1)
= O(3^n)
O(n^)
) 보다 for문(O(n)
)이 낫다.O(log n)
)