여니의 취준 준비/코딩테스트 (Java)

[Coding Test] 자바 문법, 속성 총 정리

여니's 2022. 7. 6. 16:22

목차

     < 기본적인 문장 단축키 >

    1. public static void main(String[] args){} 자동 생성

    psvm + enter > 단축키

     

     

    2. System.out.println() 자동 생성

    sout + enter

     


    < 자바 입출력 >

    (+ 클래스 이름은 Main)

     

    1. 입력

    총 3가지의 방법이 있다. 

    Scanner, BufferedReader, StringTokenizer

     

    입력 처리 속도 : (빠름) BufferedReader > StringTokenizer > Scanner (느림)

    BufferedReader, StringTokenizer은 문자열로 활용하기 위해 사용한다.

    주로 BufferedReader를 사용한다.

     

    (1) Scanner

    Scanner sc=new Scanner(System.in); // 표준입력 System.in으로부터 스캐너를 만들어 데이터를 읽어온다.
    // a = sc.nextInt();                           // int 변수 1개 입력받는 예제
    // b = sc.nextDouble();                        // double 변수 1개 입력받는 예제
    // g = sc.nextByte();                          // char 변수 1개 입력받는 예제
    // var = sc.next();                            // 문자열 1개 입력받는 예제
    // AB = sc.nextLong();                         // long 변수 1개 입력받는 예제
    
    
    # 1 2 3 4 5 입력받기
    int[] A=new int[5];
    for(int i=0; i<5; i++) A[i]=sc.nextInt();

     

    (2) BufferedReader

    참고로, BufferedReader는 Enter만 경계로 인식하고, 받은 데이터는 String으로 입력 받는다.

    따라서 가공을 해야하고, 예외처리를 해줘야한다.

     

    public static void main(String[] args) throws IOException {
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        String str=br.readline();
        int num=Integer.parseInt(br.readline());
    }

     

    (3) StringTokenizer

    : 하나의 문자열을 여러 개의 토큰으로 분리한다.

    StringTokenizer은 공백이 있을 때 공백처리를 땡겨서 채우도록 도와준다. 

     

    public static void main(String[] args) throws IOException {
        String test="Hello world";
        StringTokenizer tokenTest=new StringTokenizer(test);
        
        // for문으로 모든 값 출력
        
    }

    ex) 숫자 배열 입력받기 

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    int[][] array=new int[5][5];
    
    for (int i = 0; i < 5; i++) {
        StringTokenizer st=new StringTokenizer(br.readLine());
        for (int j = 0; j < 5; j++) {
            array[i][j]=Integer.parseInt(st.nextToken()); // 숫자 배열에 넣는 법
        }
    }

     

     

    ex) 문자 배열 입력받기 (띄어쓰기 x)

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    char[][] bombArray=new char[n][n];
    
    for (int i = 0; i < n; i++) {
        bombArray[i]=br.readLine().toCharArray();
    }

    문자열을 쪼개서 char 타입의 배열에 넣어주는 메서드 => toCharArray()

    (아래 부분에 자세한 설명이 있음)

     

     

     

    ex) 문자 배열 입력받기 (띄어쓰기 o)

     

    String[] fingerLoc = br.readLine().split(" ");
    int[] leftLoc=keyboard.get(fingerLoc[0].charAt(0));
    int[] rightLoc=keyboard.get(fingerLoc[1].charAt(0));

     

    ex)  2차원 배열 입력받기 (Scanner)

    char은 sc.next().charAt(0)으로 입력 받는다.

    public static void main(String[] args) {
        int answer=0;
        Scanner sc=new Scanner(System.in);
        int t=sc.nextInt();
        int n=sc.nextInt();
        char[][] array=new char[n][n];		
        for(int i=0; i<n; i++) {
            for(int j=0; j<n; j++) {
                array[i][j]=sc.next().charAt(0); // char 입력받는 방법
            }
        }
    }
    
    // 테케횟수와 격자크기n, 이차원 배열 입력받기
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int test_case=sc.nextInt();
        for(int t=1; t<test_case+1; t++) {
            int n=sc.nextInt();
            char[][] array=new char[n][n];		
            for(int i=0; i<n; i++) {
                for(int j=0; j<n; j++) {
                    array[i][j]=sc.next().charAt(0); // char 입력받는 방법
            }
     }

     

     


    2. 출력

     

    (1) System.out.print()

    - 형식에 구애받지 않는 형태로 출력하고자 할 때 사용

    - 줄바꿈 문자는 포함 x

     

     

    (1.1) System.out.println()

     

    - 형식에 구애받지 않는 형태로 출력하고자 할 때 사용

    - 줄바꿈 문자 포함 o

     

     

    (1.2) System.out.printf()

    - 형식을 신경써야 할 때 사용

    - 줄바꿈 문자 포함 x

     

     

     

    (2) BufferWriter

    BufferedWriter bw= new BufferedWriter(new OutputStreamWriter(System.out));
    bw.write("#"+test_case+" "); // 쓰기
    bw.write("\n"); // 엔터
    bw.close(); // stream 닫기

    사용법 참고 출처 : https://eboong.tistory.com/578

     

     

     

     

     

     

     


    < 배열 >

    (1) 배열 생성

    int 타입의 자료 3개를 저장할 수 있는 배열을 메모리에 생성한다. : new int[3]

    // 1차원 배열
    int[] arr = new int[3];
    
    // 2차원 배열
    int[][] arr= new int[3][3];

     


    (2) 배열 출력하기 (for문 사용x)

    // Arrays.toString(배열명)
    System.out.println(Arrays.toString(selectNum)); // 배열 내용 출력하기

    (3) 문자열을 쪼개서 char 타입 배열에 값 넣기 (toCharArray)

    : 문자열을 쪼개서 char 타입의 배열에 넣어주는 메서드

     

     

    문자열 -> char 타입의 배열

    String s1="hello world";
    char[] s1Arr=s1.toCharArray();

     

    char 타입의 배열 -> 문자열 

    String s2=new String(s1Arr);

    (4) 배열 및 문자열 길이 

    int num = array.length;

    (5) 8방향 delta 배열 

    // 상,상우,우,우하,하,좌하,좌,좌상
    int[][] delta= { 
        {-1,0},
        {-1,1},
        {0,1},
        {1,1},
        {1,0},
        {1,-1},
        {0,-1},
        {-1,-1}
    };

    (6) 배열 정렬 기준 변경 

    -> 1. 람다식 사용

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    package day_0816;
     
    import java.util.Arrays;
    import java.util.Scanner;
     
    public class ComparatorTest {
        
        
        public static void main(String[] args) {
            Scanner sc=new Scanner(System.in);
            int[][] persons= new int[3][2]; 
            for (int i = 0; i < 3; i++) {
                int age=sc.nextInt();
                int budget=sc.nextInt();
                persons[i][0]=age;
                persons[i][1]=budget;
            }
            Arrays.sort(persons,(o1,o2) -> o2[0]-o1[0]); // 나이순 내림차순
            for (int i = 0; i < persons.length; i++) {
                System.out.println(persons[i][0]+ " , " + persons[i][1]);
            }    
            System.out.println("__________________________");
            Arrays.sort(persons,(o1,o2) -> o1[0]-o2[0]); // 나이순 오름차순
            for (int i = 0; i < persons.length; i++) {
                System.out.println(persons[i][0]+ " , " + persons[i][1]);
            }    
        }
    }
     
    /*
    입력값 예
    15 30
    15 14
    22 19
    */
     
    cs

     

    -> 2. compareTo, compare 이용방법 

    https://eboong.tistory.com/609

     

    [1828] 냉장고 in Java (feat. 정올, Comparator, Comparable 차이 및 설명)

    http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&code=1828&sca=99 JUNGOL www.jungol.co.kr https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=hwadla&logNo=220885232086 [Java][Jun..

    eboong.tistory.com


    < ArrayList >

    (1) 배열 생성 ( ArrayList 안에 int[] 배열)

    // 1차원 배열
    ArrayList<Integer> a = new ArrayList<>();
    
    
    // 2차원 배열 (입력형식 : 정수) (N x N)
    ArrayList<Integer>[] array = new ArrayList<>();
    for(int i=0; i<N; i++){
    	array[i]=new ArrayList<>();
    [[],[],[],[],[]]
    
    
    // 2차원 배열 (입력형식 : int[])
    ArrayList<int[]>[] map= new ArrayList[N+1]; 
    for (int i = 0; i <= N; i++) {
        map[i]=new ArrayList<>(); // 열
    }
    for (int i = 0; i < M; i++) {
        st = new StringTokenizer(br.readLine());
        int a=Integer.parseInt(st.nextToken());
        int b=Integer.parseInt(st.nextToken());
        int c=Integer.parseInt(st.nextToken());
        map[a].add(new int[] {b,c});
        map[b].add(new int[] {a,c});		
    }

     

    (2) 배열 생성 (ArrayList 안에 ArrayList)

    static ArrayList<ArrayList<Integer>> map;
    
    public static void main(String[] args) throws IOException {
        map=new ArrayList<>();
        for (int i = 0; i < 3; i++) {
            map.add(new ArrayList<Integer>()); // 빈 리스트 생성
        }
    }

     

     

    (3) 배열 생성 (ArrayList 안에 class 타입)

    static class Point implements Comparable<Point>{
        int x,y,c;
        public Point(int x, int y, int c) {
            super();
            this.x = x;
            this.y = y;
            this.c = c;
        }
        @Override
        public int compareTo(Point o) {
            return this.c!=o.c? this.c-o.c : o.c-this.c;
        }
    
    }
    ArrayList<Point> array= new ArrayList<>();
    array.add(new Point(nx, ny));

     

     

     

    (4) 배열에 값 넣기

    // 1차원 배열
    for(int j=0; j<N; j++){
        array.add(값); 
    }
    
    // 2차원 배열
    for(int i=0; i<N; i++){
    	for(int j=0; j<N; j++){
        	array[i].add(값); 
        }
    }

    < 스택 (Stack) >

    (1) 스택 선언

    // 1. 스택 선언
    Stack<Interger> stack= new Stack()<>;

     

    (2) 데이터 추가

    //2. 데이터 추가
    stack.push(x);

     

    (3) 데이터 삭제

    //3. 데이터 삭제
    stack.pop();

     

    (4)  스택 맨 앞에 있는 값 확인하기

    stack.peek();

     

    (5) 스택의 사이즈 확인하기

    stack.empty();

     

    (6) 스택에서 값 찾기

    stack.contains(x); // 값이 있다면 true, 없다면 false

     


    < 큐 (Queue) >

    (1) 큐 선언

    // 1. 큐 선언
    Queue<Integer> queue= new ArrayDeque()<>; // 성능에 더 유리하다. 
    Queue<Interger> queue= new LinkedList()<>;

     

    (2) 데이터 추가 (맨 뒷부분에 값 삽입)

    // 2. 큐 데이터 추가 (맨 뒤에 값 삽입)
        // 2.1 add() : 문제 발생시 에러 발생
        queue.add(1);
    
        // 2.2 offer() : 문제 발생시 false 반환
        queue.offer(1);

     

    (3) 데이터 삭제 (맨앞에 있는 값)

    // 3. 큐 데이터 삭제 (맨앞에 있는 값 반환 후 삭제)
        // 3.1 remove() : 문제 발생시 에러 발생
        queue.remove()
    
        // 3.2 poll() : 문제 발생시 null 반환
        queue.poll()
    
        // 3.3 clear() : 큐 비우기
        queue.clear();

     

    (4) 큐 맨 앞에 있는 값 확인하기

    // 4. 큐 맨 앞의 값 확인하기
        // 4.1 element() : 문제 발생시 에러 발생
        queue.element()
    
        // 4.2 peek() : 문제 발생시 null 반환
        queue.peek()

     

    (5) 큐의 사이즈 확인하기

    queue.size();

     

    (6) 큐에서 원하는 값 찾기

    queue.contains(x); // 값이 있다면 true, 없다면 false

     

    // 1. 큐 선언
    Queue<Interger> queue= new LinkedList()<>;
    
    // 2. 큐 데이터 추가 (맨 뒤에 값 삽입)
        // 2.1 add() : 문제 발생시 에러 발생
        queue.add(1);
    
        // 2.2 offer() : 문제 발생시 false 반환
        queue.offer(1);
    
    // 3. 큐 데이터 삭제 (맨앞에 있는 값 반환 후 삭제)
        // 3.1 remove() : 문제 발생시 에러 발생
        queue.remove()
    
        // 3.2 poll() : 문제 발생시 null 반환
        queue.poll()
    
        // 3.3 clear() : 큐 비우기
        queue.clear();
    
    // 4. 큐 맨 앞의 값 확인하기
        // 4.1 element() : 문제 발생시 에러 발생
        queue.element()
    
        // 4.2 peek() : 문제 발생시 null 반환
        queue.peek()
    
    // 5. 큐 사이즈 확인
    queue.size()

    < 우선순위 큐 (Priority Queue) >

    (1) 우선순위 큐 선언

    // 1. 우선순위가 낮은 숫자 순
    PriorityQueue<Integer> queue=new PriorityQueue<>();
    // 2. 우선순위가 높은 숫자 순
    PriorityQueue<Integer> queue=new PriorityQueue<>(Collections.reverseOrder());

     

     

    참고 자료 

    https://eboong.tistory.com/579?category=1019810 

     

    [2164] 카드2 in Java

    https://www.acmicpc.net/problem/2164 2164번: 카드2 N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓

    eboong.tistory.com

     


    (2) 우선순위 큐 정렬기준 변경

    PriorityQueue<int[]> pQueue=new PriorityQueue<>((o1,o2)->o1[1]-o2[1]);

    <문자열>

    (1) 문자열 분리 

    sc.useDelimiter("-");

    Scanner를 사용할 때

    입력 자체에서 알아서 특정 문자/문자열 단위로 잘라서 받을 때

    useDelimiter를 사용한다.

    public class Main {
        public static void main(String[] args) {
            // Your Program Goes Here
            Scanner sc = new Scanner(System.in);
            sc.useDelimiter("-");
            
        }
    }

    (2) 문자열 수정하기 

    str.substring문자열 자르기 메서드인 substring을 이용하여문자열을 수정한다.

     

    String str="hello"; // hEllo
    str=str.substring(0,1) + "E" + str.substring(2);

     

    substring(int idx)

    > idx 위치부터 이후의 모든 문자열을 리턴

     

    substring(int idx,int idx2)

    > idx 위치부터 idx2-1까지의 문자열을 리턴


    (3) 아스키코드 

    문자 -> 숫자

    char c='a';
    int num=(int)c;

     

    숫자 -> 문자

    int num=65;
    char c=(char)num;

     

    현재 알파벳의 바로 전 알파벳 출력하기

    char c=sc.next().charAt(0);
    System.out.print((char)(c-1));

    (4) 대소문자 바꾸기 

    for(int i = 0; i < len; i++) {
        if(str.charAt(i) >= 'A' && str.charAt(i) <= 'Z') {
            System.out.print((char)(str.charAt(i) - 'A' + 'a'));
        }
        else {
            System.out.print((char)(str.charAt(i) - 'a' + 'A'));
        }
    }

    (5) 문자열 모든 공백 제거

    : replaceAll(" ", "") 메서드 사용하기

    public static void main(String[] args) {
    		String s1= "  Hi, How are you?";
    		s1=s1.replaceAll(" ", "") ;
    		char[] s1Arr=s1.toCharArray();
    		for (int i = 0; i < s1Arr.length; i++) {
    			System.out.println(s1Arr[i]);
    		}
    	}

     


    <Map>

    (1) Map 선언

    // Map<키 type, 값 type>
    Map<Integer, ArrayList<Integer>> map = new HashMap<Integer, ArrayList<Integer>>();

     

    (2) Map에 해당 키가 있는지 확인하는 함수 : containsKey()

    map.containsKey(키값); // -> 있으면 true, 없으면 false 반환

     


     

    (3) Map 전체출력

    entrySet : key와 value 값이 모두 필요한 경우 사용

    keySet() : key값만 필요한 경우 사용

     


     

    (4) Map 자동정렬

    : TreeMap은 put 메서드를 사용해 값을 저장하면 자동으로 정렬을 진행함

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.TreeMap;
    
    public class n20291 {
    	public static void main(String[] args) throws IOException {
    		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    		int n=Integer.parseInt(br.readLine());
    		Map<String,Integer> map=new TreeMap();
    		for (int i = 0; i < n; i++) {
    			String temp=br.readLine(); // 한줄 입력받기
    			temp=temp.substring(temp.indexOf(".")+1); // 확장자만 떼어내기
    			if(map.get(temp)==null) { // 아직 딕셔너리에 해당 확장자가 저장이 안되어 있는 경우 = 초기화
    				map.put(temp, 1);
    			}else { // 이미 해당 확장자가 키값으로 딕셔너리에 존재하는 경우 
    				map.put(temp, map.get(temp)+1);
    			}
    		}
    		for (Map.Entry<String, Integer> element : map.entrySet()) {
    			System.out.println(element.getKey()+ " " + element.getValue());
    		}
    	}
    }
    // 백준 파일정리 20291번

     


    < char -> int로 변환>

    char를 int로 변환하는 가장 간단한 방법은

    문자 '0'을 이용하는 것이다.

     

    char num='9';
    int newNum=num-'0'; // 57-48=9

     

    < int -> char 로 변환>

    int num=3;
    char c=(char)num;

     

    < string -> int 로 변환 >

    String a="3";
    int num=Integer.parseInt(a);

     

    int -> string로 변환 >

    int num=3;
    String s=String.valueOf(num);

     


    <가독성이 개선된 반복문>

    배열 및 collections에서 주로 사용되는 반복문이다.

    인덱스 대신 직접 요소에 접근하는 변수를 제공한다.

    int[] intArr={1,2,3,4,5};
    for(int x:intArr){
       System.out.println(x);
    }

     


    <최댓값, 최솟값 구하기>

    최댓값 : Integer.MAX_VALUE

    최솟값 : Integer.MIN_VALUE

    int min=Integer.MAX_VALUE;
    int max=Integer.MIN_VALUE;
    
    int[] nums={1,2,3,4,10,9,8};
    
    for(int num:nums){
    	if (num>max){
        	max=num;
        }
        if (num<min){
        	min=num;
        }
    }