🧐 coding interview
Day06. 알고리즘
dev!n
2023. 7. 10. 11:05
코딩 테스트
시간 복잡도
빅 오 표기법
- big-O (빅 오 표기법) : O() => 최악의 경우, worst case
- 점근적 상한선
- 입력 크기가 무한대로 갈 때점근적 상한
- (아무리 나빠도시간이 이보다 덜 걸림. 즉, 최악의 시나리오)
- 주로, 빅 오 표기법을 사용함
계산 방법
- 가장 큰차수 만 고려 : 예) n2 + n + 1 => O(n2)
- 계수는 1 로 함 : 예) 3n => O(1n) => O(n)
- 작은 차이는 무시 : 예) O(n-1) => O(n)
- 규모가 큰 것 만 고려 : 예) O(2n + n2) => O(2n)
크기 순서
$$ O(1) < O(log n) < O(n) < O(nlogn) < O(n2) < O(n3) < O(2n) < O(n!) < O(∞) $$
⏩ 오래 걸림
공간 복잡도
코딩 테스트에서 문제가 되는 경우는 많지 않음.
재귀 구현할 때 정도?
입력
방법: 첫째 줄에 정수의 개수 N (= 10,000,000), 둘째 줄부터 N개의 줄에 한 개의 자연수(10,000 이하)가 적힌 파일을 입력받는데 걸리는 시간을 측정. 10번 측정해서 평균값으로 순위를 매김
입력 방법 평균(초) BufferedReader, Integer.parseInt 0.6585 Scanner 4.8448
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
/**
* BufferedReader br
*/
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
/* 숫자 입력 */
int i = Integer.parseInt(bufferedReader.readLine());
long l = Long.parseLong(bufferedReader.readLine());
double d = Double.parseDouble(bufferedReader.readLine());
/* 한 줄에 여러 문자 */
// 공백 없음
char[] chars = bufferedReader.readLine().toCharArray();
// 공백으로 구분
// 방법1) String method : split()
String[] strings = bufferedReader.readLine().split(" ");
String s0 = strings[0];
String s1 = strings[1];
// 방법2) StringTokenizer st
StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine()); // 두번째 인자로 구분자 가능
String s2 = stringTokenizer.nextToken(" "); // 딜리미터 여기에 넣을 수도 있음
String s3 = stringTokenizer.nextToken();
bufferedReader.close();
/**
* Scanner sc
*/
Scanner scanner = new Scanner(System.in);
String s = scanner.next(); // 공백 전까지 읽음
String line = scanner.nextLine();
int i1 = scanner.nextInt();
long l1 = scanner.nextLong();
double d1 = scanner.nextDouble();
// 다음 입력 있는지
boolean hasNext = scanner.hasNext(); // 다음 토큰 있는지
boolean hasNextLine = scanner.hasNextLine(); // 다음 줄 있는지
scanner.close(); // 다 쓰고 닫기
}
}
출력
방법: 총 N개의 줄에 1부터 10,000,000까지의 자연수를 한 줄에 하나씩 출력하는 시간을 측정. 10번 측정해서 평균값으로 순위를 매김
출력 방법 평균(초) BufferedWriter, bf.write(i + "\n"); 0.9581 StringBuilder를 이용해 문자열 하나로 만든 다음, System.out.println(sb); 1.1881 BufferedWriter, bf.write(Integer.toString(i)); bf.newLine(); 1.2556 PrintWriter 1.954 System.out.println(i); 30.013
import java.io.IOException;
public class Main {
public static void main(String[] args) {
String str = "스트링";
System.out.println(str); // IntelliJ 자동완성 : sout
int i = 0;
long l = 1_000_000_000_000L;
double d = 3.14;
System.out.printf("%d, %d, %.3f, %s", i, l, d, str); // IntelliJ 자동완성 : souf
}
}
포맷 지정자
지시자 | 출력 |
%b | boolean 형식 |
%d | 정수 형식 |
%o | 8진수 정수 형식 |
%x 또는 %X | 16진수 정수 형식 |
%f | 소수점 형식 |
%c | 문자 형식 |
%s | 문자열 형식 |
%e 또는 %E | 지수 표현식 |
/* 포맷 지정자 문법 */
%<+면 오른쪽 정렬, -면 왼쪽 정렬><넓이><.소수점>지정자