[Java] 코딩테스트 함수 모음
태그: Java, 코딩테스트
Java 기초
라이브러리
java.lang
→ 가장 기본적인 클래스들이 모여있는 패키지이다. 추가로 import 구문이 필요없다.
아래 예제 코드에서는 어떠한 패키지에 속해져있는지 확인하기 위해 적었다.
import java.util.*;
import java.io.*;
변수 선언
import java.lang.String;
String[] arr1 = new String(5);
int[] arr2 = {1,2,3};
int N = 3;
int[] arr3 = new int[N]
int
와Integer
의 차이점- int 는 Primitive 자료형 null 로 초기화 불가능, 0으로 초기화 가능, 산술 연산 가능
Integer 는 Wrapper 클래스-객체 → null값은 처리 가능, Unboxing을 하지 않으면 산술 연산이 불가능 , 직접적인 산술연산은 불가능
Arrays
import java.lang.Integer;
import java.util.Arrays;
Integer[] arr1 = {10,2,11,4,6,1};
// 오름차순 {1,2,4,6,10,11}
Arrays.sort(arr1);
for(int s : arr1) System.out.print(s+ ",");
System.out.println();
// 내림차순 {11,10,6,4,2,1}
Arrays.sort(arr1, Collections.reverseOrder());
for(int s : arr1) System.out.print(s+ ",");
System.out.println();
// 일부만 정렬 {2,4,10,11,6,1} (0 ~ 3자리 까지)
Arrays.sort(arr1,0,4);
for(int s : arr1) System.out.print(s+ ",");
System.out.println();
// 오름차순 정렬하면 binary search로 특정 값을 찾을 수 있다.
Arrays.binarySearch(arr1,2);
for(int s : arr1) System.out.print(s+ ",");
System.out.println();
// 배열을 어레이리스트로 변환할 때
List list = Arrays.asList(arr1);
list.forEach(i -> System.out.print(i + ","));
System.out.println();
// 배열의 특정 범위 자르기
Integer[] tmp = Arrays.copyOfRange(arr1, 0, 3);
for(int s : tmp) System.out.println(s);
System.out.println();
length
/ length()
/ size()
length
: 배열의 길이 (arr.length
)length()
: String related object (str.length()
)- size(): Collections object (
list.size()
)
import java.util.ArrayList;
// length
int[] arr = new arr[3];
System.out.println(arr.length);
// length()
String str = "java";
System.out.println(str.length());
// size()
ArrayList<Integer> list = new ArrayList<>();
System.out.println(list.size());
String
String str = "hello World Java!!!";
// 문자열 공백으로 자르기
str.split(" ");
str.substring(0, 5);
for(int i=0; i < str.length(); i++) str.charAt(i);
// 문자열을 배열로 만들고 싶을 때
String str = "12345";
String[] Arr = str.split(" ");
// 대소문자 변경
str = str.toUpperCase();
str = str.toLowerCase();
// 한번 쓴 문자열은 변경 불가. substring 이용해서 새로운 변수로 선언.
String name = "HelloWorld";
String newname=name.substring(0,4)+'b'+name.substring(5);
HashMap
import java.util.HashMap;
// 선언
HashMap<String, Integer> hm = new HashMap<>();
// key-value 넣기
hm.put("java", 0);
// 키로 가져오기
hm.get("java");
// containsKey()로 존재유무 확인
if (!hm.containsKey("java")) hm.put("java",1);
// 특정 키가 없으면 갑설정, 있으면 기존 값 가져오는 함수
hm.put("java", hm.getOrDefault("java",3);
// keySet() 함수로 맵 순회
for(String key : hm.KeySet()) {
hm.get(key);
}
ArrayList
→ List는 크기가 고정인 반면 ArrayList 는 가변적이다.
내부적으로 저장이 가능한 메모리 용량(Capacity)이 있으며 현재 사용 중인 공간의 크기(Size)가 있습니다.
만약 현재 가용량(Capacity) 이상을 저장하려고 할 때 더 큰 공간의 메모리를 새롭게 할당합니다.
import java.util.ArrayList;
import java.util.Iterator;
// 선언
ArrayList<String> list = new ArrayList<>();
// 삽입
list.add("java");
list.add(0,"ryu");
// 수정
list.set(1, "C++");
// 삭제
list.remove(1);
// 값 존재 유무 확인
list.contains("java");
list.indexOf("ryu");
// iterator사용
Iterator it = list.iterator();
// 인덱스 오름차순 사용
while (it.hasNext()) {
...
}
// 인덱스 내림차순
while (it.hasPrevious()) {
...
}
// 중복없이 값을 넣고 싶을 때
if(list.indexOf(value) < 0) {
list.put(value);
}
// 리스트 값 하나씩 가져올 때 (int일 때 경우)
for(int i =0; i < list.size(); i++) {
list.get(i).intValue();
}
Queue
import java.util.Queue;
import java.util.LinkedList;
// 1. 선언
Queue<Integer> q = new LinkedList<>(); // linked list로 선언해야함
// 2. 삽입
q.add(10); // {10}
q.offer(2); // {10, 2}
// 3. 프론트값 반환
q.peek(); // 10
// 4. 삭제
q.remove();
q.poll();
// 5. 초기화
q.clear();
// 6. 비었는지
q.isEmpty();
// 7. pair 같은 경우는 그냥 구현해서 사용
static class Node{
int y;
int x;
int dist;
Node(int y,int x,int dist){
this.y=y;
this.x=x;
this.dist=dist;
}
}
Queue<Node> queue=new LinkedList<>();
queue.add(new Node(1,2,3));
Node node= queue.poll();
우선순위 큐
데이터가 들어온 순서대로 데이터가 나가는 것이 아닌 우선순위를 먼저 결정하고 그 우선순위가 높은 데이터가 먼저 나가는 자료구조이다.
PriorityQueue
를 사용하기 위해선 우선순위 큐에 저장할 객체는 필수적으로 Comparable Interface
를 구현해야한다.
import java.util.PriorityQueue;
import java.util.Collections;
// 1. 선언
PriorityQueue<Integer> pq = PriorityQueue<Integer>(); // 최소힙
PriorityQeueu<Integer> pq=PriorityQueue<Integer>(Collections.reverseOrder()); // 최대힙
// 2. 삽입
pq.add(3);
// 3. 삭제
pq.remove();
// 4. root 값 추출
pq.peek();
// 5. pair 사용 시
import java.io.IOException;
import java.util.PriorityQueue;
public class PQ {
static class Node{
int y;
int x;
Node(int y,int x){
this.y=y;
this.x=x;
}
// 비교 함수 만들어야함!!
public int compareTo(Node p) {
if(this.y < p.x) {
return -1; // 오름차순
}
else if(this.y == p.y) {
if(this.x < p.x) {
return -1;
}
}
return 1;
}
}
public static void main(String[] args) throws IOException{
PriorityQueue<Node> pq1=new PriorityQueue<>(Node::compareTo);
pq1.add(new Node(1,2));
pq1.add(new Node(1,1));
pq1.add(new Node(2,3));
pq1.add(new Node(2,1));
while(!pq1.isEmpty()){
Node node=pq1.peek();
System.out.println(node.y+" "+node.x);
pq1.remove();
}
}
}
Math
라이브러리
import java.lang.Math;
// 1. 최대 최소
Math.max(10, 2);
Math.min(10, 2);
// 2. 절대값
Math.abs();
// 3. 올림 내림 반올림
Math.ceil(-3.2); // -3
Math.floor(-3.2); // -4
Math.round(-3.26); // -3 첫째자리에서 반올림
// 3-1. 소수 둘째, 셋째 자리에서 반올림 하고 싶다면
double a = 1.23456;
String b = String.format("%.1f", a); // .1f는 둘째자리에서 반올림
// 4. 제곱 제곱근
Math.pow(2, 2); // 2^2 = 4
Math.sqrt(4); // 2
Java 입출력 팁
자바의 입력 클래스
Scanner
,BufferredReader
,StringTokenizer
BufferedReader
,StringTokenizer
는 문자열로 활용하기 위해 사용BufferedReader
를 사용하는 것이 Scanner를 사용하는 것보다 빠르다.
Scanner
사용
속한 패키지 → java.util
이다.
import java.util.Scanner;
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
long l = sc.nextLong();
String s = sc.next();
String x = sc.nextLine();
시간초과 → BufferedReader
사용
BufferedReader
사용
import java.io.BufferedReader;
import java.io.InputStreamReader;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine();
StringTokenizer
StringTokenizer
는 공백이 있을 때 뒤에 문자열이 공백처리를 땡겨 채우도록 한다.- `StringTokenizer
가
BufferedReader` 보다 빠르게 사용 될 수 있다.
<StringTokenizer를 사용했을 때>
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readline());
// 문자열 토큰의 갯수 return
int count = st.countTokens();
String A = st.nextToken();
String B = st.nextToken();
String C = st.nextToken();
String D = st.nextToken();
/*
// 문자열이 아니라 Int형 일 경우
StringTokenizer st = new StringTokenizer(br.readline());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
// 문자열인데 O를 구분으로 나누고 싶을 때 파라미터에 넣어주면된다.
StringTokenizer st = new StringTokenizer(br.readlien(), "O");
String A = st.nextToken();
String B = st.nextToken();
String C = st.nextToken();
String D = st.nextToken();
*/
<BufferedReader
를 사용했을 때>
import java.io.BufferedReader;
import java.io.InputStreamReader;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] input = br.readline().split(" ");
자바의 출력 클래스
System.out.println(””), BufferdWriter, StringBuilder
- 일반적으로 출력할 때
System.out.println(””)
를 사용한다.
적은 양의 출력에서는 편리하고 성능 차이가 없지만 많은 양의 출력을 할 때는BufferedWriter
이나 StringBuilder 를 사용하는 것이 좋다.
BufferedWriter
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.in));
String str = "abcdef";
bw.write(str); // 출력
bw.newLine(); // 줄바꿈
bw.flush(); // 남아있는 데이터 모두 출력
bw.close();
BufferedWriter
는 버퍼를 잡아 놓은 것이기에 반드시 사용후에 flush() / close() 를 해주어야 한다.
close()
를 하게 되면 출력 스트림을 아예 닫아버리기 때문에 한번 출력후에 다른 것도 출력하고자 한다면 flush()
를 사용하면 된다.
StringBuilder
그냥 문자열이기 때문에 매우 간단하다.
→ 자바에서 String 객체는 변경 불가능하다. 한 번 생성되면 내용을 바꿀 수 없단 뜻이다.
String은 변경 불가능한 문자열을 생성하지만 StringBuilder는 변경 가능한 문자열을 만들어 주기 때문에, String을 합치는 작업 시 하나의 대안이 될 수 있다.
따라서 하나의 문자열을 다른 문자열과 연결하면 새 문자열이 생성되고, 이전 문자열은 가비지 컬렉터로 들어간다.
import java.lang.StringBuilder;
StringBuilder sb = new StringBuilder();
sb.append("a");
sb.append("b").append(" ");
sb.append("c").append("\n");
String str = sb; // String에 StringBuilder를 그대로 넣을 수 없으며, toString()을 붙여야한다.
String str = sb.toString();
System.out.println(sb); // ab c\n
System.out.println(str); // ab c\n
'알고리즘' 카테고리의 다른 글
Java Collection Framework 모음 (0) | 2023.10.24 |
---|