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(0, 2, 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(3, 6, "ye"))
- .substring(int start, (int end)): 인덱싱. 파라미터가 하나라면 해당 인덱스부터 끝까지, 두개라면 시작점과 끝점-1 까지 인덱싱 (sb.substring(5), sb.substring(3, 7))
- .deleteCharAt(int index): 인덱스에 위치한 문자 하나를 삭제한다. (sb.deleteCharAt(3))
- .delete(int start, int end): start 부터 end-1 까지의 문자를 삭제한다. (sb.delete(3, sb.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)
- 컬렉션 객체를 생성할 때 저장되는 데이터의 타입을 미리 지정하는 기능
- 제네릭으로 지정한 타입 외에는 담길 수 없도록 함
- ※ 제네릭 (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
'Programming > Java' 카테고리의 다른 글
[Java] 문자열(String) 기본 메소드 (0) | 2021.09.20 |
---|---|
[Java] 빠른 입출력 (0) | 2021.09.20 |
[Java] Int to String, String to Int (String, int 변환) (0) | 2020.09.14 |
[Java] 문자 ↔ 아스키코드 상호변환하기 (0) | 2020.09.14 |
[Java] Scanner을 통해 char형 입력 받기 (0) | 2020.09.14 |