여니의 취준 준비/코딩테스트 (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;
    }
}