Java 코테 준비

LeeKyoungChang·2022년 7월 4일
0
post-thumbnail

📚 1. 표준 입력

✔ 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.ArraysArrays.fill(배열, 초기화 값)을 사용한다.
  • 연속으로 있는 숫자를 입력받기 위해서는 1번 대신 2번을 사용하자.
    - ex) 10111010101
    - 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 한줄 입력받고 하나씩 출력하기

  • 문자열에서 문자를 하나씩 자를 때는 split 메서드를 사용한다.
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);  
}

 

✔ 숫자를 한 줄로 입력받고 순서 뒤집기

  • 숫자를 한 줄로 입력받을 때는 BufferedReaderInputStreamReader를 사용한다.
  • 역순으로 변경하기 위해 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();

  • String형을 Int형 배열로 변경한다.
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 인덱스 값을 가져오고 싶을 때

  • StringcharAt 메서드를 사용하면 된다.
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에서 한 줄에 입력된 숫자를 배열에 저장하는 방법

  • BufferedReaderStringTokenizer을 사용하면 된다.
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();  
}

 

✔ 비트단위시프트연산자 <<, >>

  • 범위(32비트)를 넘어서 이동되는 비트는 삭제된다.

예시

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(값)을 해줘야 한다.

 

profile
"야, (오류 만났어?) 너두 (해결) 할 수 있어"

0개의 댓글

관련 채용 정보