Programming/Java

[Java] 자바 기초 (백준 단계별 1~7 단계)

당닝 2021. 9. 20. 03:54
728x90

파이썬을 안보는 코딩테스트를 보게 되어 갑자기 준비하는 자바 코테..!

자바로 코테라니,,, 화이팅.. 🤣🤣

 


 

🔎 백준 단계별을 풀며 알아두면 좋을 것 정리

1. 빠른 입출력

: BufferedReader, BufferedWriter, InputStreadReader, OutputStreamWriter, StringTokenizer

/// 빠른 입출력

import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int t = Integer.parseInt(br.readLine());
        StringTokenizer st;

        for(int i=0; i<t; i++){
            st = new StringTokenizer(br.readLine(), " ");

            bw.write((Integer.parseInt(st.nextToken())+Integer.parseInt(st.nextToken())) + "\n");
        }

        br.close();
        bw.flush();
        bw.close();
    }
}

2. 문자열

- String

 

  • 생성자
    • String str = "str";
    • String str = new String("str");
  • 주요 메소드
    • .length(): 문자열의 길이 (str.length())
    • .isEmpty(): 문자열이 비어있는 지 확인, 문자열의 길이(length)가 0이면 true 반환(boolean형), 0이 아니면 false를 반환
    • .charAt(int index): 문자 반환, 문자열 중 해당 인덱스의 문자(char형)를 반환합니다.(인덱스는 0 ~ 문자열의 길이(length) -1)
    • .getChars: 문자 배열 복사, 문자열을 문자(char) 배열로 복사 (str.getChars(02, ch, 0); // 시작 인덱스, 끝 인덱스, 복사 받을 char 배열 이름, 복사 시작 위치)
    • .equals(String str2): 문자열 비교, 해당 문자열과 매개변수의 문자열이 같은 지 비교하여 true 또는 false를 반환합니다.(boolean형)
    • .compareTo(String str2): 문자열 비교(사전 순으로 대소 비교), 해당 문자열과 매개변수의 문자열을 사전 순으로 비교
      • 반환값 :
        • str과 str2의 같을 경우 : 0
        • str이 str2보다 사전 순으로 앞인 경우 : -1
        • str이 str2보다 사전 순으로 뒤인 경우 : 1
        • * str의 마지막 문자열과 str2의 마지막 문자를 제외하고 같은 경우
          • 예 ) String str = new String("ccca"); String str2 = new String("cccz")
          • str과 str2의 마지막 문자열을 비교하여 사전 순 차이만큼 반환 : -25
    • .indexOf(String s): 해당 문자열이 위치하는 인덱스를 반환합니다.(int형) (해당 문자열이 존재하지 않으면 -1을 반환합니다.)
    • .lastIndexOf(String s) : 문자열 마지막 위치, 해당 문자열이 마지막으로 위치하는 인덱스를 반환합니다.(int형)
    • .substring(int start, (int end)): 문자열 자르기, 해당 문자열의 인덱스만큼 잘라서 반환합니다.(String형), (매개 변수가 2개인 경우 : 해당 범위만큼 자름, 1개인 경우 : 앞에서부터 인덱스만큼 자름)
    • .concat(String str2): 문자열 합치기, 해당 문자열 뒤에 매개변수 문자열을 서로 합칩니다.
    • .replace(String s1, String s2): 문자열 치환, 해당 문자를 찾아 다음 문자로 변경
    • .contains(String str2): 문자열 포함, 해당 문자열이 포함되어 있는지 확인합니다. 포함할 경우 true, 아닌 경우 false 반환(boolean형)
    • .split(String s): 문자열 분리, 문자열을 해당 문자열을 기준으로 모두 분리합니다.(String [] 반환)
    • .trim(): 문자열 공백 제거, 해당 문자열의 앞, 뒤의 공백을 모두 제거합니다.(문자열 사이의 공백은 제거되지 않음)
    • .toUpperCase()/.toLowerCase(): 문자열 전체 대문자/소문자 변환
public class str {
    public static void main(String[] args){
        String str = "abcde";

        // 문자열의 길이
        System.out.println(str.length()); // 5

        // 문자열이 비어있는 지 확인
        System.out.println(str.isEmpty()); // false

        // 문자 반환
        System.out.println(str.charAt(3)); // d
        
        // 문자 배열 복사
        char[] c = new char[4];
        str.getChars(0, 3, c, 0);
        System.out.println(c); // abc

        // 문자열 비교
        System.out.println(str.equals("abcde")); // true

        System.out.println(str.compareTo("abcde")); // 0
        System.out.println(str.compareTo("ab")); // 3
        System.out.println(str.compareTo("abcdg")); // -2

        // 문자열 위치하는 인덱스 반환
        System.out.println(str.indexOf("cd")); // 2

        // 문자열 마지막 위치
        System.out.println("abcabcabc".lastIndexOf("b")); // 7

        // 문자열 인덱싱, 문자열 자르기
        System.out.println(str.substring(3)); // de
        System.out.println(str.substring(1, 4)); // bcd

        // 문자열 합치기
        System.out.println(str.concat("fg")); // abcdefg
        System.out.println(str + "hij"); // abcdehij

        // 문자열 치환, 문자열 교체
        System.out.println("abcabcabc".replace("ab", "o")); // ocococ

        // 문자열 포함
        System.out.println(str.contains("abc")); // true

        // 문자열 분리
        String[] str2 = "hi my name is".split(" ");
        
        for(int i=0; i<4; i++){
            System.out.printf(str2[i] + "/");
        } // hi/my/name/is/
        System.out.println();

        // 문자열 공백 제거
        System.out.println("\t        bye        \n\n".trim()); // bye
    }
}

 

 

 

- StringTokenizer: 구분자로 문자열 나누기 (java.util.StringTokenizer)

 

  • 생성자 
    • StringTokenizer(String s): 디폴트 구획문자로 공백문자(\t, \n, \r, \f)를 가짐.
    • StringTokenizer(String s, String delim): 구획문자(delimiter)를 인자로 받는 생성자. 구획문자는 2자리 이상도 설정할 수 있다. 구획문자를 $%라고 설정하면 $, %를 기준으로 끊어준다. %%라고 설정하면 %를 기준으로 끊어준다 즉 구획문자는 길이가1로 고정이고 길이가 2이상인 구획문자를 받으면 구획문자가 여러개가 된다.
    • StringTokenizer(String s, String delim, boolean returnDelims): 구획문자(delimiter)를 인자로 받는 생성자. returnDelims가 true이면 구획문자도 토큰으로 간주한다. 각 구획문자는 길이가 1인 String이 된다. 예를들어 delimiter가 %%라도 % 2개로 저장된다. returnDeilms가 false면 구획문자를 token으로 사용하지 않는다. 위의 두 생성자는 디폴트로 false를 가진다.
  • 주요 메소드
    • .countTokens(): 토큰의 개수 리턴
    • .nextToken():  다음 토큰을 리턴. 이전 토큰은 제거.
    • .nextToken(String delim): 구획문자(delimiter)를 delim으로 바꾼 후 바뀐 다음 토큰을 리턴한다. 예를들어 this$1is$1string 이라고 하면 생성자에서 구획문자를$1로 설정했다가 nextToken으로 this를 받고 2번째 nextToken은 delim을 $로 받으면(nextToken("$")) 1is를 리턴한다.
    • .hasMoreTokens(): 리턴할 다음 토큰이 있으면 true를 다음 토큰이 없으면 false를 리턴한다.

 

- StringBuilder (java.lang.StringBuilder)

 

  • 생성자
    • StringBuilder sb = new StringBuilder(): 객체 선언
    • StringBuilder sb = new StringBuilder("aaa"): 문자열을 바로 넣을 수도 있다.
  • 주요 메소드
    • .append(): 문자열을 추가한다. (sb.append("bbb"), sb.append(4))
    • .insert(int offset, String str): offset 위치에 str을 추가한다. (sb.insert(2"ccc"))
    • .replace(): 첫번째와 두번째 파라미터로 받는 숫자 인덱스에 위치한 문자열을 대체한다. (.replace(36"ye"))
    • .substring(int start, (int end)): 인덱싱. 파라미터가 하나라면 해당 인덱스부터 끝까지, 두개라면 시작점과 끝점-1 까지 인덱싱 (sb.substring(5), sb.substring(37))
    • .deleteCharAt(int index): 인덱스에 위치한 문자 하나를 삭제한다. (sb.deleteCharAt(3)
    • .delete(int start, int end): start 부터 end-1 까지의 문자를 삭제한다. (sb.delete(3sb.length()))
    • .toString(): String으로 변환한다. (sb.toString())
    • .reverse(): 해당 문자 전체를 뒤집는다. (sb.reverse())
    • .setCharAt(int index, String s): index 위치의 문자를 s로 변경
    • .setLength(int len): 문자열 길이 조정, 현재 문자열보다 길게 조정하면 공백으로 채워짐, 현재 문자열보다 짧게 조정하면 나머지 문자는 삭제
    • .trimToSize(): 문자열이 저장된 char[] 배열 사이즈를 현재 문자열 길이와 동일하게 조정, String 클래스의 trim()이 앞 뒤 공백을 제거하는 것과 같이 공백 사이즈를 제공하는 것, 배열의 남는 사이즈는 공백이므로, 문자열 뒷부분의 공백을 모두 제거해준다고 보면 됨
import java.lang.StringBuilder;

public class sb {
    public static void main(String[] args) throws IOException{
        StringBuilder sb = new StringBuilder("aaa");

        // 문자열 추가
        System.out.println(sb.append("bbb")); // aaabbb
        System.out.println(sb.append(4)); // aaabbb4

        // 문자열 삽입
        System.out.println(sb.insert(2, "ccc")); // aacccabbb4
        
        // 문자열 치환, 문자열 교체
        System.out.println(sb.replace(3, 6, "ye")); // aacyebbb4

        // 인덱싱, 문자열 자르기
        System.out.println(sb.substring(5)); // bbb4
        System.out.println(sb.substring(3, 7)); // yebb

        // 문자 삭제
        System.out.println(sb.deleteCharAt(3)); // aacebbb4

        // 문자열 삭제
        System.out.println(sb.delete(3, sb.length())); // aac

        // 문자열 변환
        System.out.println(sb.toString()); // aac

        // 문자열 뒤집기
        System.out.println(sb.reverse()); // caa

        // 문자 대체, 문자 교체, 문자 치환
        sb.setCharAt(1, 'b');
        System.out.println(sb); // cba

        // 문자열 길이 조정
        sb.setLength(2);
        System.out.println(sb); // cb
    }
}

 

 

- repeat: 문자열 일정하게 반복하기

 

  • ex) String s = "abc".repeat(3) /// >> abcabcabc (파이썬의 "abc" * 3)
    •  

- int to String, String to int

 

  • int to String: Integer.toString(int val)
  • String to int: Integer.parseInt(String str)

3. 배열

- 배열 길이 구하기

 

  • arr.size()

 

- Arrays (java.util.Arrays)

 

  • .asList(arr): 배열을 ArrayList로 변환해준다.배열은 크기가 정해져있고 값의 삭제 등이 자유롭지 않아 불편한 점이 많다. asList를 사용하여 리스트로 변환한 후 체인메소드(chain method) 방식으로 ArrayList의 메소드를 더하여 활용하면 여러모로 편리한 점이 많다.
  • .toString(arr): 배열에도 toString이 존재한다. toString이라는 메소드는 클래스에서 ALT+SHIFT+S를 누른 후 Generate toString을 이용해 오버라이딩할 수 있다.
  • sort
    • sort(arr):기본적으로 Sort()를 하면 오름차순 정렬이 된다. 정수형 배열을 내림차순 정렬하고 싶으면 반복문으로 배열을 뒤에서부터 꺼내 담아주거나 하는 방식을 사용
    • sort(arr, comparator): Collections.reverseOrder() 라는 메소드가 있는데, sort의 첫번째 파라미터에 문자형 배열을 담고 두번째 파라미터에 Collections.reverseOrder() 를 담으면 문자형 배열을 내림차순 정렬해준다. (java.util.Collections)
    • sort(arr, int start, int end): 인덱스의 시작과 끝을 정해 start부터 end-1까지만 오름차순 정렬할 수도 있다.
    • sort(arr, int start, int end, comparator): 인덱스의 시작과 끝을 정해 start부터 end-1까지만 문자열 배열을 내림차순 정렬할 수도 있다.
  • .copyOf(arr2, int newlength): 배열을 복사한다. 파라미터로는 복사하고자 하는 배열과 새로운 배열의 크기가 들어간다.
import java.util.Arrays;
import java.util.Collections;

public class arr {
    public static void main(String[] args){
        String[] sarr = {"a", "b", "c", "d", "z", "e", "abc"};
        int[] iarr = {1, 2, 3, 4, 5, 6, 123, 7};

        // ArrayList로 변환
        System.out.println(Arrays.asList(sarr)); // [a, b, c, d, z, e, abc]
        
        // String으로 변환
        System.out.println(Arrays.toString(sarr)); // [a, b, c, z, e, abc]
        System.out.println(Arrays.toString(iarr)); // [1, 2, 3, 4, 5, 6, 123, 7]

        // sort, 오름차순 정렬
        Arrays.sort(sarr);
        System.out.println(Arrays.toString(sarr)); // [a, abc, b, c, d, e, z]
        Arrays.sort(iarr);
        System.out.println(Arrays.toString(iarr)); // [1, 2, 3, 4, 5, 6, 7, 123]

        // sort, 내림차순 정렬 (문자열 배열)
        Arrays.sort(sarr, Collections.reverseOrder());
        System.out.println(Arrays.toString(sarr)); // [z, e, d, c, b, abc, a]
        
        Integer[] Iarr = {1, 2, 3, 4, 5, 6, 7, 123};
        Arrays.sort(Iarr, Collections.reverseOrder());
        System.out.println(Arrays.toString(Iarr)); // [123, 7, 6, 5, 4, 3, 2, 1]

    
        // sort, 인덱싱 정렬
        Arrays.sort(sarr, 3, 6);
        System.out.println(Arrays.toString(sarr)); // [z, e, d, abc, b, c, a]
        Arrays.sort(sarr, 2, 5, Collections.reverseOrder());
        System.out.println(Arrays.toString(sarr)); // [z, e, d, b, abc, c, a]

        // 배열 복사
        String[] arr2 = Arrays.copyOf(sarr, Arrays.asList(sarr).size());
        System.out.println(Arrays.toString(arr2)); // [z, e, d, b, abc, c, a]
    }   
}

4. 컬렉션 프레임워크

- List: ArrayList, Vector, LinkedList

  • 배열 또는 연결리스트 자료구조와 동일한 구조 (순서를 가지는 자료 구조)
  • 기존 배열과 연결리스트를 편하게 사용할 수 있도록 클래스가 구성되어 있음.

- Set: HashSet, TreeSet

  • 데이터를 중복으로 저장하지 않음 (중복된 데이터가 없는 집합)
  • 값을 해싱해서 저장하거나 이진 트리 구조를 이용해서 데이터 처리 속도를 높임
  • 컬렉션 프레임워크 중 가장 빠른 검색 속도를 가짐

- Map: HashMap, HashTable, TreeMap

  • 데이터를 키(key)와 값(value)로 구분하여 구성 (순서를 가지지 않는 자료 구조)
  • 인덱스 대신 키값을 효율적인 방식으로 검색하여 검색 속도를 높임
  • 키는 인덱스의 기능이기 때문에 중복될 수 없음 (값은 중복 가능)
  • 데이터 입력 시 동일한 키를 사용하면 값을 덮어씀

 

- ArrayList (java.util.arrayList)

 

  • 생성자
    • new ArrayList() : 기본 크기가 10인 배열 생성
    • new ArrayList(기본크기) : 기본 크기를 지정 (배열이 다 차면 기본크기만큼 사이즈가 증가함)
    • new ArrayList<제네릭>() : 배열 값의 타입을 지정
      • ※ 제네릭 (Generic)
         - 컬렉션 객체를 생성할 때 저장되는 데이터의 타입을 미리 지정하는 기능
         - 제네릭으로 지정한 타입 외에는 담길 수 없도록 함
  • 주요 메소드
    • .add((index), val): 순서대로 리스트를 추가, 배열 사이즈 초과 시 초기 설정된 사이즈만큼 자동으로 사이즈가 증가함, 인덱스를 추가로 지정해주면 해당 인덱스에 값을 삽입
    • .get(index): 해당 인덱스의 값 반환
    • .set(index, val): 인덱스로 값 변경
    • .indexOf(val): 값을 제공하면 해당 값의 첫번째 인덱스를 반환
    • .lastindexOf(val): 해당 값의 마지막 인덱스 반환
    • .remove(index or val): 해당 인덱스의 값 or 해당 값 중 첫번째 값 삭제
    • .contains(val): 해당 값이 배열에 있는지 검색해서 true / false 반환
    • .containsAll(val1, val2...): argument로 제공한 컬렉션의 모든 값이 포함되어 있는지 여부를 true / false로 반환
    • .toArray(): ArrayList 타입의 인스턴스를 일반 배열 타입으로 반환, 저장할 배열 타입에 맞춰 자동 형변환, 배열 크기 또한 자동으로 맞춰서 바꿔줌
    • .clear(): 값 모두 삭제
    • .isEmpty(): 비었으면 true, 하나라도 값이 있으면 false 반환
    • .addAll(arr2): 두 컬렉션을 합침
    • .retainAll(arr2): argument로 제공한 컬렉션 내에 들어있는 값을 제외하고 모두 지워줌
    • .removeAll(arr2): argument로 제공한 컬렉션 내에 들어있는 값과 일치하는 값을 모두 지워줌, retainAll() 메소드와 반대
    • .size(): 요소 개수 반환
import java.util.ArrayList;

public class arrList {
    public static void main(String[] args){
        ArrayList<String> al = new ArrayList<String>();

        // 리스트 요소 추가
        al.add("박");
        al.add("김");
        al.add("최");
        System.out.println(al); // [박, 김, 최]

        al.add(1, "이");
        System.out.println(al); // [박, 이, 김, 최]

        // 해당 인덱스의 값 반환
        System.out.println(al.get(0)); // 박

        // 인덱스로 값 변경
        al.set(3, "정");
        System.out.println(al); // [박, 이, 김, 정]

        // 인덱스로 값 찾기
        al.add("박"); // [박, 이, 김, 정, 박]
        System.out.println(al.indexOf("박")); // 0
        System.out.println(al.lastIndexOf("박")); // 4

        // 값 삭제
        al.remove(4);
        System.out.println(al); // [박, 이, 김, 정]

        al.add("정"); // [박, 이, 김, 정, 정]
        al.remove("정");
        System.out.println(al); // [박, 이, 김, 정]

        // 값 포함하는지
        System.out.println(al.contains("정")); // true

        // Array로 변환
        System.out.println(al.toArray()); // [Ljava.lang.Object;@7d6f77cc

        // 배열 비우기
        al.clear();
        System.out.println(al); // []

        // 배열 비었는 지 확인
        System.out.println(al.isEmpty()); // true

        // 두 리스트 합치기
        ArrayList<String> al1 = new ArrayList<String>();
        al1.add("박");
        al1.add("김");
        al1.add("이");

        ArrayList<String> al2 = new ArrayList<String>();
        al2.add("최");
        al2.add("정");
        al2.add("박");

        al1.addAll(al2);
        System.out.println(al1); // [박, 김, 이, 최, 정, 박]

        // 한 리스트가 한 리스트 포함하는지
        System.out.println(al1.containsAll(al2)); // true

        // 리스트 해당 요소 빼고 지우기
        al1.retainAll(al2);
        System.out.println(al1); // [박, 최, 정, 박]

        // 리스트 해당 요소 지우기
        al1.removeAll(al2);
        System.out.println(al1); // []

        // 요소 개수 반환
        System.out.println(al1.size()); // 0
        System.out.println(al2.size()); // 3
    }
}

 

- HashSet (java.util.hashSet)

 

  • 생성자
    • new HashSet<값 제네릭>();
    • 인자값으로 용량과 사용률을 줄 수 있음 (HashMap과 동일)
    • 용량 : 해시 테이블의 갯수를 의미 (카테고리의 갯수라고 보면 됨, 기본 16)
    • 사용률 : 해시 테이블이 얼마만큼 다 차면 늘려줄 것인지 퍼센트를 기입 (기본 0.75)
  • 주요 메소드
    • .add(val): 값 추가, 정렬 없이 내부 로직에 맞는 위치에 저장됨, 중복값을 추가할 경우 변동 없음
    • .addAll(hs2): 제공한 다른 컬렉션의 값을 합쳐줌, 중복된 값은 무시
    • .contains(val): 제공한 값이 Set에 있는지 여부를 확인하여 true / false 반환
    • .remove()/.removeAll(): 제공한 값을 제거/제공한 컬렉션이 가진 모든 값을 찾아서 제거

- HashMap

  • 생성자
    • new HashMap<키 제네릭, 값 제네릭>() : 기본 용량 16, 사용률 0.75의 빈 HashMap 생성
    • argument로 (int Capacity, float loadFactor)를 직접 지정할 수 있음
    • 용량은 해싱기법을 통해 분류되는 카테고리의 갯수라고 할 수 있음
    • 사용률은 전체 용량을 변경할 조건을 의미함 (75%가 차면 현재 용량의 2배로 용량 변경 등)
  • 주요 메소드
    • .put(키, 값): 키(Key)와 값(value)을 입력, 제네릭으로 지정한 타입에 맞는 일반 배열을 이용해 한번에 넣어줄 수 있음, 만약 중복되는 키값을 제공하면 기존 키가 가지고 있던 값을 제공된 값으로 변경함
    • .keySet()/values(): 키 / 값을 별도로 추출하여 컬렉션 형태로 반환 (Set 생성)
    • .get(키): 키값을 제공하면 해당 값을 반환
    • .replace(키, 값): 키값과 바꿀 값을 제공하면 해당 키의 값을 변경함
    • .containsKey()/.containsValue(): key / value가 존재하는지 여부 확인 후 true / false 반환
    • .remove(키): 제공한 키값의 항목을 제거
    • .clear(): 모두 삭제

 

 

* 기타

 

  • 정수형 길이 세기: 숫자 변수를 Math.log10..라는 함수에 넣기
public class lenthTest {
    public static void main(String[] args){
        int n=34567;
        int intLength = (int)(Math.log10(n)+1);
        System.out.println(intLength);
    }
}

 

  • 아스키코드: (int)'A' (char)65
public class Main {
	public static void main(String[] args) {
    	
        //문자 -> 아스키코드 변환
        System.out.println((int) '9'); //>> 57
        System.out.println((int) 'A'); //>> 65
        
        //아스키코드 -> 문자 변환
        System.out.println((char) 57); //>> 9
        System.out.println((char) 65); //>> A
	}
}

 

 

  • String to Char
char c = sc.next().charAt(0);

 

  • Char to String
String s2 = Character.toString(c);

 

  • Char 배열 to String
// 1. String 생성자
public void charArrayToString1() {
    char[] charArray = { 'H', 'e', 'l', 'l', 'o', 'W', 'o', 'r', 'l', 'd' };
    String str = new String(charArray);
    System.out.println(str);
}

// 2. String.valueOf
public void charArrayToString2() {
    char[] charArray = { 'H', 'e', 'l', 'l', 'o', 'W', 'o', 'r', 'l', 'd' };
    String str = String.valueOf(charArray);
    System.out.println(str);
}

// 3. StringBuilder
public void charArrayToString3() {
    char[] charArray = { 'H', 'e', 'l', 'l', 'o', 'W', 'o', 'r', 'l', 'd' };
    StringBuilder sb = new StringBuilder();
    for (char ch : charArray) {
        sb.append(ch);
    }
    String str = sb.toString();
    System.out.println(str);
}

// 4. Stream
Character[] charArray = { 'H', 'e', 'l', 'l', 'o', 'W', 'o', 'r', 'l', 'd' };
Stream<Character> charStream = Arrays.stream(charArray);
String str = charStream.map(String::valueOf).collect(Collectors.joining());
System.out.println(str);

 

728x90