
포스트를 작성하게 된 계기
평소에 파이썬을 이용해서 코딩 테스트 문제를 풀이하였는데, 우아한 형제들은 코딩 테스트 언어를 자바로 제한하였고, SCPC 역시 파이썬 언어를 지원하지 않아서 자바로 코딩 테스트 준비를 시작해보게되었다.
자바에서는 기본적으로 Scanner를 이용해 입력을 받을 수 있고, System.out.print 를 통해서 출력을 할 수 있다. 이 방법을 이용해도 문제가 없는 경우가 많지만, 많은 양을 입력받고, 출력해야되는 경우, 시간 초과를 발생시킬 여지가 있습니다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] input = br.readLine().split(" ");
BufferedReader 를 사용하면 Scanner보다 빠르게 입력 문자열을 입력 받을 수 있습니다.
출력에는 BufferedWriter, StringBuilder를 사용해서 출력할 수 있다.
BufferedWriter는 버퍼를 잡아 놓은 것이기에 반드시 사용후에 flush()/close()를 해주어야한다. close()를 하게되면 출력 스트림을 아예 닫아버리기 때문에 한번 출력후에 다른 것도 출력하고자 한다면 flush()를 사용하면 된다
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); // 선언
String str = "abcdef"; // 출력할 문자열
bw.write(s); // 출력
bw.newLine(); // 줄바꿈
bw.flush(); // 남아있는 데이터 모두 출력
bw.close();
StringBuilder sb = new StringBuilder();
sb.append("a");
sb.append("b").append(" ");
sb.append("c").append("\n");
System.out.println(sb);
아래 라이브러리 들을 import해주고 시작하는 것이 좋다.
import java.util.*;
import java.io.*;
자바 어레이는 아래와 같은 방식으로 생성할 수 있다.
String[] arr1 = new String[5];
int[] arr2 = {1, 2, 3};
int N = 3;
int[] arr3 = new int[N];
자바 어레이에 자주 쓰이는 메소드들은 아래와 같다.
int arr[] = {10, 8, 11, 2, 3, 0};
// 1. 오름차순 {0, 2, 3, 8, 10, 11}
Arrays.sort(arr1);
// 2. 내림차순 {11, 10, 8, 3, 2, 0}
Arrays.sort(arr1, Collections.reverseOrder());
// 3. 일부만 정렬 {2, 8, 11, 10, 3, 0} (0~4만 정렬)
Arrays.sort(arr1, 0, 4)
// 4. 오름차순 정렬하면 binary search로 특정 값을 찾을 수 있다.
Arrays.binarySearch(arr1, 2);
// 5. 배열을 어레이리스트로 변환할 떼!
List list = Arrays.asList(arr1);
// 6. 배열의 특정 범위 자르기
int tmp[] = Arrays.copyOfRange(arr1, 0, 3);
.length()로 배열의 길이를 구할 수 있다.
문자열 관련 도움되는 코드들은 아래와 같다.
String str = "hello world";
// 1. 자르기
str.split(" ");
str.substring(0, 5);
for(int i = 0; i < str.length(); i++) str.charAt(i);
// 1-1. 문자열을 배열로 만들고 싶을 때
String str = "12345";
String[] Arr = str.split("");
// 대소문자 변경
str = str.toUpperCase(); // HELLO WORLD
str = str.toLowerCase(); // hello world
// 한번 쓴 문자열은 변경 불가. substring 이용해서 새로운 변수로 선언해야함
String name="starfucks";
String newname=name.substring(0,4)+'b'+name.substring(5); // starbucks
// 1. 선언
HashMap<String, Integer> hm = new HashMap<>();
// 2. key-value 넣기
hm.put("java", 0);
// 3. 키로 값 가져오기
hm.get("java");
// 4. containsKey()로 존재유무 확인
if (!hm.containsKey("java")) hm.put("java", 1);
// 5. 특정 키가 없으면 값 설정, 있으면 기존 값 가져오는 함수
hm.put("java", hm.getOrDefault("java", 3);
// 6. keySet() 함수로 맵 순회
for(String key : hm.KeySet()) {
hm.get(key);
}
// 1. 선언
ArrayList<String> list = new ArrayList<>();
// 2. 삽입
list.add("java"); // {"java"}
list.add(0, "ryu"); // {"ryu", "java"} (0번째 인덱스에 삽입)
// 3. 수정
list.set(1, "c++"); // {"ryu", "c++"}
// 4. 삭제
list.remove(1); // {"ryu"}
// 5. 값 존재 유무 확인
list.contains("java"); // false
list.indexOf("ryu"); // 0 존재하면 인덱스 리턴
// 6. iterator 사용
Iterator it = list.iterator();
// 6-1. 인덱스 오름차순 순회
while (it.hasNext()) {
...
}
// 6-2. 인덱스 내림차순 순회
while (it.hasPrevious()) {
...
}
// 7. 중복없이 값을 넣고 싶을 때
if (list.indexOf(value) < 0) { // 없으면 -1을 리턴하기 때문에
list.put(value);
}
// 8. 리스트 값 하나씩 가져올 때 (int 일 경우)
for(int i = 0; i < list.size(); i++) {
list.get(i).intValue();
}
// 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();
// 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();
}
}
}
// 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
저도 개발자인데 같이 교류 많이 해봐요 ㅎㅎ! 서로 화이팅합시다!