✔ Java 알고리즘 최적화 팁
Scanner
보다는 BufferedReader
를 사용하는 것이 좋다.split
보다는 StringTokenizer
를 사용하여 파싱하는 것이 좋다.StringBuilder
를 사용해 한번에 출력하는 것이 좋다.Array
를 사용하는 것보다 ArrayList
를 사용하는 것이 좋다.ArrayList
를 정렬하기 위해서는 Collections.sort()
를 사용한다.🔔 다른 정렬 방법
private static int swap3(int localA, int localB) {
return localA;
}
public static void main(String[] args) {
int a = 20, b= 5;
b = swap3(a, a= b);
System.out.println(a + " " + b);
}
java.util.Arrays
의 Arrays.fill(배열, 초기화 값)
을 사용한다.String[] inputs = br.readLine().split("");
br.read() - '0';
Java로 알고리즘 문제를 풀면 일반적으로 다음과 같이 입력을 받고 이후의 로직을 작성하게 된다.
public class Main {
// 입력으로 받는 값들을 저장하기 위한 변수
private static int N, M;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
// 단어 목록을 입력으로 받아서 리스트에 추가한다.
while(N-->0){
... 입력을 받음
}
}
}
✔ String.format()
%
를 붙여 문자열에 사용하면 그 위치에 변수의 값을 형식화 하여 대입 가능하다.try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
float x = Float.parseFloat(br.readLine());
System.out.format("%f",x);
br.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
✔ java 한줄 입력받고 하나씩 출력하기
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
String[] line_s = s.split(" ");
for(int i = 0 ;i < line_s.length;i++){
System.out.print(line_s[i] + " ");
}
br.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
✔ 숫자를 한 줄로 입력받고 순서 뒤집기
BufferedReader
와 InputStreamReader
를 사용한다.StringBuffer
을 사용한다.try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
StringBuffer sb = new StringBuffer(s);
s = sb.reverse().toString();
String[] list_s = s.split(" ");
for (String list_ : list_s) {
System.out.print(list_ + " ");
}
br.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
✔ 똑같은 문자 여러 개 출력하기
Collections.nCopies
를 사용하면 된다. try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
List list = Collections.nCopies(3, s);
for (Object o : list) {
System.out.print(o + " ");
}
br.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
✔ String 배열을 Int형 배열로 변경하기
int[] arr = Arrays.stream(rs).mapToInt(Integer::parseInt).toArray();
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
String[] rs = s.split("\\.");
int[] arr = Arrays.stream(rs).mapToInt(Integer::parseInt).toArray();
System.out.format("%04d.%02d.%02d",arr[0],arr[1],arr[2]);
br.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
✔ 문자열에서 특정 문자 제거하기
replace 함수
를 사용하면 된다.try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
String result = s.replace("-","");
System.out.println(result);
br.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
✔ .
을 기준으로 문자열 나누기
s.split("\\.");
와 같이 사용하여 나눈다.
String[] list_s = s.split("\\.");
✔ Java에서 String 인덱스 값을 가져오고 싶을 때
String
의 charAt
메서드를 사용하면 된다.String s = "abcd";
s.charAt(0); // a
✔ 문자들을 합쳐서 문자열을 만들기
rs += s.charAt(i);
List list = Collections.nCopies(s.length()-i-1,"0");
for (Object o : list) {
rs += o;
}
System.out.println("["+rs+"]");
rs = "";
✔ 8진수로 입력 받고 10진수로 출력하기
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int decimal = Integer.parseInt(br.readLine(), 8);
System.out.format("%d",decimal);
✔ 문자 1개를 입력받고 10진수로 출력하기
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
char alpha = br.readLine().charAt(0);
System.out.println((int)alpha);
br.close();
✔ 10진수를 입력받아 문자로 변경하기
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int decimal = Integer.parseInt(br.readLine());
System.out.println((char)decimal);
br.close();
✔ Java에서 한 줄에 입력된 숫자를 배열에 저장하는 방법
BufferedReader
와 StringTokenizer
을 사용하면 된다.import java.io.*;
import java.util.StringTokenizer;
public class CU1038 {
public static void main(String[] args) throws IOException {
final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
final StringTokenizer st = new StringTokenizer(br.readLine()); // 문자열을 나눈다.
// 정수로 치환
final long[] nums = new long[st.countTokens()];
for(int i=0 ; i<nums.length;i++){
nums[i] = Long.parseLong(st.nextToken());
}
System.out.println(nums[0] + nums[1]);
br.close();
}
}
✔ 기존 알파벳을 다음 알파벳으로 바꾸기
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
char r;
if(s.charAt(0) == 'z'){
r = 'a';
}else{
r = (char)((int)s.charAt(0) + 1);
}
System.out.println(r);
br.close();
}
✔ java에서 sum 함수
Arrays.stream(arr).sum()
와 같은 Arrays를 사용하면 된다.public static void main(String[] args) throws Exception{
final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
final StringTokenizer st = new StringTokenizer(br.readLine());
final long[] arr = new long[st.countTokens()];
for(int i =0 ; i<arr.length;i++){
arr[i] = Long.parseLong(st.nextToken());
}
// 합
long sum = Arrays.stream(arr).sum();
// 평균
float avg = (float)sum / 3;
System.out.println(sum);
System.out.printf("%.1f",avg);
br.close();
}
✔ 비트단위시프트연산자 <<, >>
예시
int a=10;
printf("%d", a<<1); //10을 2배 한 값인 20 이 출력된다.
printf("%d", a>>1); //10을 반으로 나눈 값인 5 가 출력된다.
printf("%d", a<<2); //10을 4배 한 값인 40 이 출력된다.
printf("%d", a>>2); //10을 반으로 나눈 후 다시 반으로 나눈 값인 2 가 출력된다.
✔ 10진수 비트단위로 NOT 하여 출력하기
public static void main(String[] args) throws IOException {
final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int decimal = Integer.parseInt(br.readLine());
System.out.println(~decimal);
br.close();
}
✔ Java 배열에서 가장 큰 값와 작은 값 찾기
Arrays.stream(arr).max().getAsLong();
Arrays.stream(arr).min().getAsLong();
public static void main(String[] args) throws IOException {
final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
final StringTokenizer st = new StringTokenizer(br.readLine());
final long[] arr = new long[st.countTokens()];
for(int i=0;i<arr.length;i++){
arr[i] = Long.parseLong(st.nextToken());
}
long arrMax = Arrays.stream(arr).max().getAsLong();
System.out.println(arrMax);
br.close();
}
가 있지만, stream을 사용하면 시간 복잡도가 커진다.
왠만하면 반복문을 통해 최댓값과 최솟값을 구하자!
public static void main(String[] args) throws IOException {
final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
final StringTokenizer st = new StringTokenizer(br.readLine());
final long[] arr = new long[st.countTokens()];
for(int i=0;i<arr.length;i++){
arr[i] = Long.parseLong(st.nextToken());
}
long min_data = Integer.MAX_VALUE;
for(int i=0;i<arr.length;i++){
if(min_data > arr[i])
min_data = arr[i];
}
System.out.println(min_data);
br.close();
}
Integer.MAX_VALUE
: 가장 큰 값Integer.MIN_VALUE
: 가장 작은 값
✔ 배열에서 짝수만 출력하기
List<자료형> list = ArrayList<>();
제네릭형으로 많이 사용한다.public static void main(String[] args) throws IOException {
final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
final StringTokenizer st = new StringTokenizer(br.readLine());
final long[] arr = new long[st.countTokens()];
for(int i=0;i<arr.length;i++){
arr[i] = Long.parseLong(st.nextToken());
}
// 자료형 저장하기 위해 사용한다.
List<Long> list = new ArrayList<>();
for(int i =0;i<arr.length;i++){
if(arr[i] % 2 == 0){
list.add(arr[i]);
}
}
for(int i =0;i<list.size();i++){
System.out.println(list.get(i));
}
br.close();
}
✔ BufferedWriter 사용법
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));//선언
String s = "abcdefg";//출력할 문자열
bw.write(s);//출력
bw.newLine(); //줄바꿈
bw.flush();//남아있는 데이터를 모두 출력시킴
bw.close();//스트림을 닫음
BufferedWriter
의 경우 버퍼를 잡아 놓았기 때문에 반드시 flush() / close()를 반드시 호출해주어 뒤처리를 해줘야 한다.bw.write
에는 System.out.println();
과 같이 자동개행기능이 없기 때문에 개행을 해주어야할 경우에는 \n
를 통해 따로 처리해줘야 한다.bw.write
를 사용할 때는, 입력할 때 String.valueOf(값)
을 해줘야 한다.