코딩 테스트(Coding Test)/알고리즘 개념
코테 필수 문법
배씌
2024. 10. 6. 00:43
[Java]
프리미티브 타입(Primitive type) : int, long, float, double
레퍼런스 타입(Reference type) : Integer, Long, Float, Double
대부분 프리미티브 타입이 빠름. 그러나, 컬렉션에서 정수형 or 부동소수형을 저장할때 사용하기 때문에 반드시 알아야함.
엡실론을 포함한 연산에 주의할 것 !
System.out.println(10.0 % 3.2) # 모듈러 / 0.399999999999947
10 % 3.2 의 결과값이 0.4가 아니라, 위와 같다.
자바는 부동소수형 데이터를 이진법으로 표현하기 때문 -> 엡실론
// 프리미티브 타입 사용법
int i = 0;
long[] longs = new long[10];
float f = 10.5f;
double d = 10 / 3.0;
// 레퍼런스 타입 사용법(꼭 필요한 경우 아니면 굳이 사용X)
Integer I = 0;
Long[] Longs = new Long[10];
Float F = 10.5f;
Double D = 10 / 3.0;
// 문법 오류 발생
ArrayList<int> arrayList = new ArrayList<>();
Stack<long> stack = new Stack<>();
Queue<float> queue = new Queue<>();
ArrayDeque<double> arrayDeque = new ArrayDeque<>();
// 올바른 코드
ArrayList<Integer> arrayList = new ArrayList<>();
Stack<Long> stack = new Stack<>();
Queue<Float> queue = new Queue<>();
ArrayDeque<Double> arrayDeque = new ArrayDeque<>();
컬렉션 프레임워크
리스트(ArrayList), 스택(Stack), 큐(Queue), 데크(ArrayDeque), 해시맵(HashMap)
1. 리스트
일반적으로 ArrayList를 의미함.
// 리스트 객체 생성
ArrayList<Integer> list = new ArrayList<>();
// 값 추가
list.add(1);
list.add(2);
list.add(4);
list.add(6);
System.out.println(list.get(2)); // 4
System.out.println(list); // [1, 2, 4, 6]
2. 해시맵
키(key)와 값(value) 쌍을 저장하는 해시 테이블로 구현되어 있음.
// 해시맵 초기화
HashMap<String, Integer> map = new HashMap<>();
// 해시맵 값 삽입
map.put("apple", 1);
map.put("banana", 2);
map.put("orange", 3);
// 해시맵 값 출력
System.out.println(map); // {banana=2, orange=3, apple=1}
// 해시맵 데이터 검색
String key = "apple";
if (map.containsKey(key)){
int value = map.get(key);
System.out.println(key + ": " + value); // apple: 1
}
else{
System.out.println(key + "는 해시맵에 없습니다.");
}
// 해시맵 수정 : 해시맵 내부는 해시 테이블로 구성되어 있어 키를 찾거나 하지 않아도 됨
map.put("banana", 4);
System.out.println(map); // {banana=4, orange=3, apple=1}
// 해시맵 삭제
map.remove("orange")
System.out.println(map); // {banana=4, apple=1}
3. StringBuffer, StringBuilder
일반적으로 String s = "abc"; 후에 s += "def" 를 실행하면
1) 새로운 String s 객체 생성
2) s가 가진 "abc" 값을 하나씩 복사
3) "abc" 뒤에 "def" 저장
=> 코드 한줄에서 총 6번의 내부 연산이 수행됨
이를 해결하기 위해 StringBuffer, StringBuilder 클래스 사용
// StringBuilder 객체 생성
StringBuilder sb = new StringBuilder();
// 문자열 Add
sb.append(10);
sb.append("ABC");
// 출력
System.out.println(sb); // 10ABC
sb.deleteCharAt(3); // 3번째 인덱스 문자 삭제
System.out.println(sb); // 10AC
sb.insert(1, 2); // 1번째 인덱스에 2라는 문자 추가
System.out.prinln(sb); // 120AC
코딩 테스트 코드 구현 노하우
조기 반환
코드 실행 과정이 함수 끝까지 도달하기 전에 반환하는 기법
public static void main(String[] args){
System.out.println(totalPrice(4, 50));
}
static int totalPrice(int quantity, int price){
int toal = quantity * price;
if(total > 100)
return (int)(total * 0.9);
return total;
}
보호 구문
본격적인 로직을 진행하기 전 예외 처리 코드를 추가하는 기법
import java.util.List;
static double calculateAverage(List<Integer> numbers){
if(numbers == null) // null 이면 종료(예외)
return 0;
if(numbers.isEmpty()) // 데이터가 없으면 종료(예외)
return 0;
int total = numbers.stream().mapToint(i -> i).sum(); // 예외 처리 후 기능 구현
return (double) total / numbers.size();
}
제네릭(generic)
빌드 레벨에서 타입을 체크하여 타입 안정성을 제공하고, 타입 체크와 형변환을 생략할 수 있게 해주어 코드를 간결하게 만듬
List list = new ArrayList();
list.add(10);
list.add("abc");
int sum1 = (int)list.get(0) + (int)list.get(1); // 런타임 오류 발생
List<Integer> genericList = new ArrayList<>();
genericList.add(10);
genericList.add("abc"); // 문법(빌드 레벨) 오류 발생
int sum2 = genericList.get(0) + genericList.get(1);