새소식

인기 검색어

개인공부

코딩테스트를 하며 가장 많이 사용하는 클래스 및 메소드 정리

  • -

1) 배열(Array)을 리스트(ArrayList)로 변환 : Array to ArrayList

더보기

💡 배열(Array)을 배열 리스트(ArrayList)로 변환하는 방법에 대해서 공유합니다.

1. Arrays 함수를 이용한 변환 방법 : Arrays.asList()


import java.util.*;

// 1. Array Initialize 
String[] strArr = {"one", "two", "three"};

// 1.1. [배열 -> 컬렉션 함수] 배열 리스트(ArrayList) 선언 및 초기화합니다.
List<String> strArrList = Arrays.asList(strArr); 					// ArrayList : ["one", "two", "three"]

// 1.2. [배열 -> 컬렉션 함수] 배열 리스트(ArrayList) 선언 및 초기화합니다.
List<String> strArrList = new ArrayList<>(Arrays.asList(strArr));    // ArrayList : ["one", "two", "three"]

 
 

2. 반복문을 이용한 변환 방법 : for ~ each


import java.util.*;

String[] strArr = {"one", "two", "three"};
List<String> strArrList = new ArrayList<>();

for (String s : strArr)
    strArrList.add(s);    // ArrayList : ["one", "two", "three"]

 
 

3. Stream API를 이용한 변환 방법 : Arrays(). stream(). collect()


import java.util.*;

String[] strArr = {"one", "two", "three"};
List<String> strArrList = Arrays.stream(strArr).collect(Collectors.toList());    // ArrayList : ["one", "two", "three"]

 
 

[참고] 기본 자료형 Array to List  에러 발생 및 해결 방법 : int [] to List <Integer> 


💡 정수 배열을 정수 리스트로 변환을 할 때 즉시 변환이 안 되는 변환 문제가 발생합니다.
💡 그렇기에 다른 자료형과 다르게 처리가 됩니다
  원소의 추가/삭제 set 사용
new ArrayList <>() 가능 가능
Arrays.asList() 불가능 가능
// 1. Array Initialize
int[] intArr = {1, 2, 3, 4, 10, 45, 65, 33};

// 2. 타입 변수의 인스턴스가 없으므로 int[]이(가) Integer을(를) 준수합니다 추론 변수 T에 호환되지 않는 바운드가 있습니다. equality constraints: Integer lower bounds: int[]
List<Integer> inteArrList = Arrays.asList(intArr);

 

 

 
 

1. for문을 이용하여 값 구성 방법

// 1. Array Initialize
int[] intArr = {1, 2, 3, 4, 10, 45, 65, 33};

// 2. ArrayList Initialize
List<Integer> intArrList = new ArrayList<>();

// 3. Array to ArrayList
for (int intItem : intArr) {
    intArrList.add(intItem);
}

 

2. Steam API를 이용하여 값 구성방법

// 1. Array Initialize
int[] intArr = {1, 2, 3, 4, 10, 45, 65, 33};

// 2. ArrayList Initialize
List<Integer> intArrList = new ArrayList<>();

// 3. Array to ArrayList
intArrList = Arrays.stream(intArr).boxed().collect(Collectors.toList());

 

[참고] 기본 자료형을 래퍼 클래스로 Boxing 관련 참고 링크
 

[Java/Short] 기본 자료형과 래퍼 클래스의 박싱(Boxing)과 언박싱(Unboxing) 방법

해당 페이지에서는 자주 사용하는 개발 패턴으로 "기본 자료형을 래퍼 클래스로 변환(Boxing)하거나 래퍼 클래스를 기본 자료형으로 변환(Unboxing)”하는 방법에 대해서 공유합니다. 1) 기본 자료형

adjh54.tistory.com

 

2) 리스트(ArrayList)를 배열(Array)로 변환

더보기

💡 리스트(ArrayList)를 배열로 변환하는 방법에 대해서 공유합니다.

 

1. List 함수를 이용한 변환 방법: List.toArray()


String[] resultArr;
List<String> strArrList = Arrays.asList("one", "two", "three");

// 1. [컬렉션 함수 -> 배열] 배열의 사이즈를 지정하고 값을 넣어줍니다.
resultArr = strArrList.toArray(new String[strArrList.size()]);          // String[] : ["one", "two", "three"]

 
 

2. 반복문을 이용한 변환 방법 : for문


String[] resultArr;
List<String> strArrList = new ArrayList<>(Arrays.asList("one", "two", "three"));

// 1. Array Size Initialize
resultArr = new String[strArrList.size()];

	// 2. [컬렉션 함수 -> 배열] for문으로 배열의 값을 넣어줍니다.
for (int j = 0; j < strArrList.size(); j++) {
    resultArr[j] = strArrList.get(j);                                    // String[] : ["one", "two", "three"]
}

 
 

3. ArrayList <Integer>를 int []로 변환방법


💡 해당 방법에서는 List -> Integer [] -> int []로 변환을 하는 과정입니다.
// [STEP1] 리스트 구성
List<Integer> integerList = Arrays.asList(93, 30, 55);

// [STEP2] List<Integer> to Integer[]로 변환
Integer[] integerArr = answerList.toArray(new Integer[answer.length]);

// [STEP3] Integer[] to int[]로 변환: 언박싱
int[] resultArr = Arrays.stream(integerArr).mapToInt(Integer::intValue).toArray()

 


Import

import java.util.*;
import java.io.*;

import는 java.util.* 하나만 선언하면 대부분의 라이브러리 함수, 콜렉션 함수들을 사용할 수 있다. 코딩테스트 시 이거 하나 선언하고 시작하면 함수를 찾지 못한다는 에러는 만나지 않을 것이다.

 

정렬(Arrays.sort, Collections.sort) 함수

더보기

Arrays.sort - 원시타입 데이터 정렬

int[] arr = {1,3,4,5,6};
Arrays.sort(arr);
//역순
Arrays.sort(intArr, Collections.reverseOrder())


Comparerator?

Comparator는 정렬을 하기 위한 여러 가지 명세를 제공하는 인터페이스
1. 사용자는 이 인터페이스를 명세대로 직접 구현한 클래스를 만들 수 있습니다. 
2. 이미 구현되어 있는 구현체를 사용할 수 있습니다.
Arrays.sort(intArr, Collections.reverseOrder())
 위의 내림차순으로 intArr을 정렬하는 코드가 대표적인 2번의 예시입니다. 
Collections.reverseOrder() 클래스의 리턴값을 전달인자로 주었습니다.
⇒ Collections 클래스의 reverseOrder() 메서드는 내부적으로 Comparator 인터페이스를 구현한 구현체를 리턴합니다. 

 

정리
1. java 배열의 정렬은 Array.sort를 통해 사용하며 java.util패키지에 있습니다.
2. Sort ( 배열 )  메서드를 를 통해, 기본값으로 오름차순 정렬을 할 수 있습니다., 
3. Sort ( 배열, Comparator ) 메서드를  를 통해서 원하는 방식대로 정렬을 할 수 있습니다. 


Collections.sort - 레퍼런스 데이터 정렬

Comparable 인터페이스


class Student {

    String name;

    int Score;

}

 이렇게 정의되어있을 때 두개의 Point 객체가 있을때 서로 비교를 한다고 할 때, 어느 것이 작고, 어느것이 큰지
비교를 할 수 없습니다. 그런데 비교를 해야 한다고 하면 어떤 걸 기준으로 크고 작은지 판단을 해야 합니다. 

이 기준을 잡아주는 것이 Comparable 인터페이스이고, 이 인터페이스를 구현한 클래스는 정렬을 하고자 할 때 정렬이 가능한 클래스가 됩니다.

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
 
class Student implements Comparable{
    int score;
    String name;
 
    Student (int score, String name) {
        this.score = score;
        this.name = name;
    }
 	
    @Override
    public int compareTo(Object obj){
        Student s2 = (Student)obj;
 
        return s2.score - this.score;
    }
 
    public String toString(){
        return score + "," + name;
    }
}
 
public class ComparableTest {
    public static void main(String[] args) {
        List<Student> list = new ArrayList<>();
        list.add(new Student(20,"lee"));
        list.add(new Student(15,"choi"));
        list.add(new Student(9,"kim"));
        list.add(new Student(12,"park"));
 
        Collections.sort(list);
 
        for (Student s : list) {
            System.out.println(s.score);
        }
    }
}

원래 Collections.sort()는 기준을 재정의하지 않는다면 오름차순으로 정렬을 합니다. 하지만 나는 내림차순으로 정렬을 원한다면 Comparable 인터페이스를 implements 해야합니다. 그리고 Comparable 인터페이스의 추상메소드인 compareTo 메소드를 구현하여야 한다. a.compareTo(b) 가 있을 때

 

a > b : 양수를 반환
a == b : 0을 반환
a < b : 음수를 반환
 
이렇게 반환을 하게된다. 따라서 위의 compareTo 메소드를 보면 this.score의 this 는 a의 score를 의미하고 인자의 s2.score는 b의 score 가 됩니다.


하지만 CompareTo 메소드는 이미 정의 되어 있는 클래스를 상속받아서 다시 정의를 해야하는 비효율적인 면이 있습니다.


이름으로 정렬의 기준을 잡아놓은 것을 나중에라도 사용할 수 있기 때문에 남겨놓고 새로운 정렬기준을 하나 더 쓰고 싶을 경우가 있고 계속 정렬기준을 바꿀 상황이 존재하는데 이럴 때마다 compareTo 메소드를 재정의하기는 번거롭습니. 이럴 때 사용하는 것이 Comparator 인터페이스이다. 

Comparator 인터페이스 

Collections.sort(list, comparator); 이런 형태의 정렬 방법이 존재한다. 앞에는 기존대로 컬렉션 객체가 들어가고, 뒤에 Comparator 객체가 들어가게 된다. 그러면 정렬시 list의 기준이 아니라 새롭게 매개변수값으로 받은 Comparator 객체를 기준으로 해서 정렬을 실행하게 된다. Comparable는 나의 compareTo() 메소드에 상대를 넣어서 비교를 했다면,

​Comparator는 비교대상 2개를 가지고 판단을 하게 된다. int compare(T o1, T o2); 이 메소드를 통해 두 객체의 특정 값을 연산해서 음수가 나오면 o1의 객체가 작다고 판단하며, 양수가 나오면 o2의 객체가 작다고 판단을 하게된다.

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
 
class Student implements Comparable{
    int score;
    String name;
 
    Student (int score, String name) {
        this.score = score;
        this.name = name;
    }
 
    public int compareTo(Object obj){
        Student s2 = (Student)obj;
 
        return s2.score - this.score;
    }
 
    public String toString(){
        return score + "," + name;
    }
}
 
public class ComparableTest {
    public static void main(String[] args) {
        List<Student> list = new ArrayList<>();
        list.add(new Student(20,"lee"));
        list.add(new Student(15,"choi"));
        list.add(new Student(9,"kim"));
        list.add(new Student(12,"park"));
 
        Collections.sort(list, new Comparator<Student>() {
            @Override
            public int compare(Student s1, Student s2) {
                if (s1.score < s2.score) {
                    return -1;
                } else if (s1.score > s2.score) {
                    return 1;
                }
                return 0;
            }
        });
 
 
        for (Student s : list) {
            System.out.println(s.score);
        }
    }
}

Math 함수

더보기
// 1. 최대 최소
Math.max(10, 2);
Math.min(10, 2);

// 2. 절대값
Math.abs();

// 3. 올림 내림 반올림
Math.ceil(-3.2);		// -3
Math.floor(-3.2);		// -4
Math.round(-3.26);		// -3	첫째자리에서 반올림

// 3-1. 소수 둘째, 셋째 자리에서 반올림 하고 싶다면
double a = 1.23456;
String b = String.format("%.1f", a);	// .1f는 둘째자리에서 반올림

// 4. 제곱 제곱근
Math.pow(2, 2);		// 2^2 = 4
Math.sqrt(4);		// 2

 문자, 문자열 처리 함수

더보기

문자열을 나누는 방법 split도 있지만 StringTokenizer를 소개한다.

StringTokenizer st = new StringTokenizer(operation);
String order = st.nextToken();
int num = Integer.parseInt(st.nextToken());

문자열을 하나하나 입력하고 정답을 뒤로 출력하고 싶을 때는

StringBuilder sb = new StringBuilder();
sb.reverse();

문자열을 부분 부분 필요한 것만 얻고 싶을 때

str.substring(3, 6); 
// 0부터 시작하는 인덱스에서 3번째부터 6번 미만까지 (즉 5번째)

 

list를 순회하는 방법 (Iterator를 사용하면 순회하면서 제거하는 게 가능하기 때문에 편한다)

for (Iterator<Pair> it = list.iterator(); it.hasNext();) {
    Pair p = it.next();
    if(p.a == 5)
    	it.remove();
}

 

대소문자 구분

 

1) 문자열이 전부 소문자인지

validation 하는 메서드를 구현하는 과정 필요한 대소문자 구분을 알아보자.

 

  • String 클래스에서는 문자열을 대소문자로 변환할 수 있는 메소드를 제공한다. 이걸 이용해보자.
  • 소문자인지 알고 싶을 땐 들어온 input값을 모두 소문자로 바꾼 뒤 기존 input과 같은지 확인한다.
// input은 String 타입이다.
input.toLowerCase()
input.toLowerCase()

 

private static void validateLower(String input) {
        if (!input.toLowerCase().equals(input)) {
            throw new IllegalArgumentException("cryptogram은 알파벳 소문자로만 이루어져 있다.");
        }
    }

* 여기서 잠시 깜빡하고 문자열 비교에 '==' 연산자를 사용했다.  기억하자! 문자열 비교에는 equals를 쓰자!!

* 또 equals는 대소문자를 구분한다. (구분 원하지 않으면 equalsIgnoreCase() 사용)

 

if (!input.toLowerCase().equals(input)) {
if (input.toLowerCase() != input) {  // 안돼~

 

 

2) 특정 문자열이 소문자인지, 대문자인지

 

Character.isUpperCase(str.charAt(0));
Character.isLowerCase(str.charAt(0));

 

해당 메서드는  Character 클래스에서 제공하는 메서드이다.

char 타입이 들어가야 한다. charAt은 char 타입을 반환한다.


검색알고리즘

더보기

이진검색

Arrays 클래스의 이진검색을 사용할 때 원시타입이 아닌 레퍼런스 타입끼리 비교할 때의 인자값으로 비교 방법을 정의한 Comparator을 넘겨줘야 한다.

 

Java Platform SE 8

 

docs.oracle.com

 

자바 [JAVA] - Comparable 과 Comparator의 이해

아마 이 글을 찾아 오신 분들 대개는 Comparable과 Comparator의 차이가 무엇인지 모르거나 궁금해서 찾아오셨을 것이다. 사실 알고보면 두 개는 그렇게 어렵지 않으나 아무래도 자바를 학습하면서 객

st-lab.tistory.com

이 블로그를 참고하여 익명클래스로 각각의 비교 방법들을 정의하는 방법을 배웠다

 

테스트 코드

// 신체검사 데이터 배열에서 이진 검색

import java.util.Arrays;
import java.util.Scanner;
import java.util.Comparator;

class PhysExamSearch {
    //--- 신체검사 데이터 ---//
    public static class PhyscData {
        private String name;          // 이름
        private int height;        // 키
        private double vision;        // 시력

        //--- 생성자(constructor) ---//
        public PhyscData(String name, int height, double vision) {
            this.name = name;
            this.height = height;
            this.vision = vision;
        }

        //--- 문자열로 만들어 반환하는 메서드 --//
        public String toString() {
            return name + " " + height + " " + vision;
        }

        //--- 키의 오름차순으로 정렬하기 위한 comparator 익명 개체 구현 ---//
        public static final Comparator<PhyscData> HEIGHT_ORDER = new Comparator<PhyscData>() {

            @Override
            public int compare(PhyscData o1, PhyscData o2) {
                return o1.height > o2.height ? 1 : o1.height == o2.height ? 0 : -1;
            }
        };
        //--- 시력의 오름차순으로 정렬하기 위한 comparator 익명 개체 구현 ---//
        public static final Comparator<PhyscData> VISION_ORDER = new Comparator<PhyscData>() {
            @Override
            public int compare(PhyscData o1, PhyscData o2) {
                return o1.vision > o2.vision ? 1 : o1.vision == o2.vision ? 0 : -1;
            }
        };
    }

    public static void main(String[] args) {
        Scanner stdIn = new Scanner(System.in);
        PhyscData[] x = {                    // 키의 오름차순으로 정렬
                new PhyscData("강민하", 162, 0.3),
                new PhyscData("이수연", 168, 0.4),
                new PhyscData("황지안", 169, 0.8),
                new PhyscData("유서범", 171, 1.5),
                new PhyscData("김찬우", 173, 0.7),
                new PhyscData("장경오", 174, 1.2),
                new PhyscData("박준서", 175, 2.0),
        };
        System.out.print("키가 몇 cm인 사람을 찾고 있나요?: ");
        int height = stdIn.nextInt();                // 킷값을 읽어 들임
        int idx = Arrays.binarySearch(
                x,                                 // 배열 x에서
                new PhyscData("", height, 0.0),    // 키가 height인 요소를
                PhyscData.HEIGHT_ORDER             // HEIGHT_ORDER에 의해 검색
        );

        if (idx < 0)
            System.out.println("그 값의 요소가 없습니다.");
        else {
            System.out.println("그 값은 x[" + idx + "]에 있습니다.");
            System.out.println("찾은 데이터: " + x[idx]);
        }
    }
}

 

 

배열, 문자열 및 자료구조 정리

더보기

QUEUE

// 1. 선언
Queue<Integer> q = new LinkedList<>();		// linked list로 선언해야함

// 2. 삽입
q.add(10);			// {10}
q.offer(2);			// {10, 2}

// 3. 프론트값 반환
q.peek();			// 10

// 4. 삭제
q.remove();
q.poll();

// 5. 초기화
q.clear();

// 6. 비었는지
q.isEmpty();

// 7. pair 같은 경우는 그냥 구현해서 사용
static class Node{
        int y;
        int x;
        int dist;
        
        Node(int y,int x,int dist){
            this.y=y;
            this.x=x;
            this.dist=dist;
       }
   }

Queue<Node> queue=new LinkedList<>();
queue.add(new Node(1,2,3));
Node node= queue.poll();

ArrayList

// 1. 선언
ArrayList<String> list = new ArrayList<>();

// 2. 삽입
list.add("java");			// {"java"}
list.add(0, "ryu");			// {"ryu", "java"} (0번째 인덱스에 삽입)

// 3. 수정
list.set(1, "c++");			// {"ryu", "c++"}

// 4. 삭제
list.remove(1);				// {"ryu"}

// 5. 값 존재 유무 확인
list.contains("java");		// false
list.indexOf("ryu");		// 0 존재하면 인덱스 리턴

// 6. iterator 사용
Iterator it = list.iterator();

// 6-1. 인덱스 오름차순 순회
while (it.hasNext()) {
	...
}

// 6-2. 인덱스 내림차순 순회
while (it.hasPrevious()) {
	...
}

// 7. 중복없이 값을 넣고 싶을 때
if (list.indexOf(value) < 0) {	// 없으면 -1을 리턴하기 때문에
	list.put(value);
}

// 8. 리스트 값 하나씩 가져올 때 (int 일 경우)
for(int i = 0; i < list.size(); i++) {
	list.get(i).intValue();
}

HashMap

// 1. 선언
HashMap<String, Integer> hm = new HashMap<>();

// 2. key-value 넣기
hm.put("java", 0);

// 3. 키로 값 가져오기
hm.get("java");

// 4. containsKey()로 존재유무 확인
if (!hm.containsKey("java")) hm.put("java", 1);

// 5. 특정 키가 없으면 값 설정, 있으면 기존 값 가져오는 함수
hm.put("java", hm.getOrDefault("java", 3);	

// 6. keySet() 함수로 맵 순회
for(String key : hm.KeySet()) {				
	hm.get(key);
}

Arrays

int arr[] = {10, 8, 11, 2, 3, 0};

// 1. 오름차순 {0, 2, 3, 8, 10, 11}
Arrays.sort(arr1);

// 2. 내림차순 {11, 10, 8, 3, 2, 0}
Arrays.sort(arr1, Collections.reverseOrder());

// 3. 일부만 정렬 {2, 8, 11, 10, 3, 0} (0~4만 정렬)
Arrays.sort(arr1, 0, 4)

// 4. 오름차순 정렬하면 binary search로 특정 값을 찾을 수 있다.
Arrays.binarySearch(arr1, 2);

//4.2 레퍼런스 타입의 데이터배열은 Comparator을 두번쨰 매개변수로 넘겨주어야한다
Arrays.binarySearch(arr2,new Comparator(){
	@Override
    public T compare(T o1, To2){
    	return o1 - o2; 
    }
};
)

// 5. 배열을 어레이리스트로 변환할 떼!
List list = new ArrayList(Arrays.asList(arr1));

// 6. 배열의 특정 범위 자르기
int tmp[] = Arrays.copyOfRange(arr1, 0, 3);

 

 

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.