본문 바로가기
프로젝트 개발 기록/[개발] java | spring

[Java] 코딩테스트 대비 정리 (2)

by HelloJudy 2022. 11. 7.

처음부터 다 알려고 하지 말자!

문제 풀면서 새로 알게 된 개념. 기억하고 싶은 개념을 기록하자.

 


형변환

✔️ String -> int

1) Integer.parseInt(String s)

  • int 타입을 리턴한다.

2) Integer.valueOf(String s)

  • parseInt와 다르게 Integer Object를 리턴한다. 그리고 .intValue()를 사용하여 int 타입으로 형변환할 수 있지만 붙이지 않아도 자동으로 형변환이 된다.

 

✔️ String -> char[]

1) str.toCharArray()

  • 이때 str은 String 타입이다.

 

✔️ int -> String

1) Integer.toString(int i)

2) String.valueOf(int i)

3) i (int타입의 값) + ""

 

✔️ char -> int

1) Character.getNumericValue(char c)

char c = '1';
int n = Character.getNumericValue(c);

System.out.println(n); // 1
  • char을 그냥 int로 바꾸면 아스키 코드로 변해서 다음 메서드를 사용해야지 진짜 숫자로 바뀐다.

 

문자열

✔️ String 클래스에 추가된 메소드 (Java 11)

  • strip(): 문자열 앞, 뒤의 공백 제거.
  • stripLeading(): 문자열 앞의 공백 제거.
  • stripTrailing(): 문자열 뒤의 공백 제거.
  • isBlank(): 문자열이 비어있거나, 공백만 포함되어 있을 경우 true를 반환한다.
    • String.trim().isEmpty()와 결과가 동일.
  • repeat(n): n개만큼 문자열을 반복하여 붙여서 반환함.

출처: https://steady-coding.tistory.com/598

 

 

✔️ String 문자열을 배열로 자르기

1) String.split() 구분자

String input = "1,2,3,4,5";
String[] splitedInput = input.split(",");
// ["1","2","3","4","5"]

 

2) String.split() 공백제거 후 구분자로 나누기

 

아래와 같이 하면 구분자 주변 공백도 제거해서 배열을 만들 수 있다.

// 정규 표현식 사용
String input = "1, 2, 3, 4, 5";
String[] splitedInput = input.trim().split("\\s*,\\s*");



// Stream() API 사용
String input = "1, 2, 3, 4, 5";
String[] splitedInput = Arrays.stream(input.split(","))
                .map(String::trim)
                .toArray(String[]::new);

 

 

✔️ 구분자 넣어서 문자열 붙이기 (Java String Joiner, Stream)

우리 착한 자바는^^... 일반 프로그래밍 언어처럼 

s = ""

s += "안녕"
s += "하세요"

이렇게 문자열을 붙이면 안된다.

왜냐하면 자바의 String 클래스는 변경 불가능한 ReadOnly이기 때문에 새로운 문자열을 만든다.

그래서 반복적인 문자열 추가는 메모리 낭비가 된다.

 

그래서 StringBuilder, StringBuffer 등을 사용하게 되는데

이번엔 " "(공백)을 기준으로 String을 합치기 위해 StringJoiner에 대해서 알아보자.

 

// public StringJoiner(CharSequence delimiter, CharSequence prefix, CharSequence suffix)

StringJoiner sj = new StringJoiner(" ");

이때 구분자를 넣어줄 수 있다.

또한 2번째, 3번째 파라미터로 prefix 와 suffix 도 붙여줄 수 있다.

 

StringJoiner sj = new StringJoiner(" ");
sj.add("안녕");
sj.add("친구들");

System.out.println(sj.toString()); // 안녕 친구들

 

  • Stream으로 처리하면
List<String> fruits = Arrays.asList("사과", "바나나", "키위");

String fruits_string = fruits.stream().collect(Collectors.joining("-", "[", "]"));
System.out.println(fruits_string);

 

✔️ 리스트 join

1) 문자 리스트 join

List<String> members = Arrays.asList("judy", "nick");
String result = String.join(",", members); // "judy,nick"

2) 숫자 리스트 join

String numbers = intList.stream().map(String::valueOf).collect(Collectors.joining(","));
System.out.println(numbers); // 1,2,3

 

 

✔️ 문자열 뒤집기

1) StringBuilder, StringBuffer

String str = "abcde";

StringBuilder sb = new StringBuilder(str);
String reversedStr = sb.reverse().toString();

System.out.println(reversedStr); // edcba

 

2) Collections.reverse(char[] ch) 

 

String 클래스에도 reverse 메서드가 있으면 좋겠는데.. ㅠ 그립다 파이썬

대신 Collections 클래스에서는 reverse 메서드를 제공하고 있다. 형변환 후 메서드를 사용해보자.

String str = "abcde";

char[] ch = str.toCharArray();
List<Character> list = new ArrayList<>();
for(char each : ch){ 
	list.add(each);
}

// reverse
Collections.reverse(list);

ListIterator li = list.listIterator();
while(li.hasNext()){
	System.out.print(li.next()); // edcba
}

 

 

✔️ 정렬 (Sorting)

📎참고 자료

 

1) int 배열 오름차순

Arrays.sort(arr);

 

2) int 배열 내림차순

Arrays.sort(arr, Collections.reverseOrder());

// 람다식
Arrays.sort(arr, (i1, i2) -> i2 - i1);

 

3) String 배열, 문자열 길이 순서로 정렬

Arrays.sort(arr, new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        return s1.length() - s2.length();
    }
});

 

4) String 배열, 정렬 기준이 2가지 일 때

Arrays.sort(arr, new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
    	if (s1.length() == s2.length()) {
        	return s1.compareTo(s2);
        } else {
        	return s1.length() - s2.length();
        }
    }
});

 

 

✔️ 중복 체크

1) String에서 중복 체크

    public static void validateDuplicateNumber(String input) {
        String[] numbers = input.split("");
        if (numbers.length != Arrays.stream(numbers).distinct().count()) {
            throw new IllegalArgumentException(DUPLICATE_ERROR_MESSAGE);
        }

 

2) List에서 중복 체크

    public static void validateDuplicateNumber(List<Integer> numbers) {
        Set<Integer> numSet = new HashSet<>(numbers);
        if (numSet.size() != numbers.size()) {
            throw new IllegalArgumentException(DUPLICATE_ERROR_MESSAGE);
        }
    }

 

 

✔️ 배열을 리스트로 변환

출처

1) ListToArray

// 1. toArray() - 배열 선언과 동시에 할당
String[] arr = list.toArray(new String[0]); // ["a", "b", "c"]
//String[] arr = list.toArray(String[]::new);   // java11~ 이상

// 2. toArray() - 배열 선언 후 채워 넣음
String[] arr2 = new String[list.size()];
list.toArray(arr2); // ["a", "b", "c"]

 

2) Stream API

// 3. Stream API (Java8 이상)
String[] arr3 = list.stream().toArray(String[]::new);

 

 

Enum

✔️ enum 활용

public enum Rank {
    FIRST(6, false, 2_000_000_000),
    SECOND(5, true, 30_000_000),
    THIRD(5, false, 1_500_000),
    FOURTH(4, false, 50_000),
    FIFTH(3, false, 5_000),
    MISS(0, false, 0);

    private final int matchCount;
    private final boolean matchBonus;
    private final int prize;


    Rank(int matchCount, boolean matchBonus, int prize) {
        this.matchCount = matchCount;
        this.matchBonus = matchBonus;
        this.prize = prize;
    }

	// 조건에 일치하는 type 찾기
    public static Rank getRankByMatchCount(int matchCount, boolean matchBonus) {
        for (Rank type : Rank.values()) {
            if (type.getMatchCount() == matchCount && type.getMatchBonus() == matchBonus) {
                return type;
            }
        }
        return MISS;
    }
    
    // name="FIRST" 일 때 matchCount 찾기
    // Rank.FIRST.getMatchCount로 외부에서 가져올 수도 있음.
    public static int getMatchCountByName(String name) {
        for (Rank type : Rank.values()) {
            if (type.name().equals(name)) {
                return type.getMatchCount();
            }
        }
        return 0;
    }

    public int getMatchCount() {
        return matchCount;
    }

    public boolean getMatchBonus() {
        return matchBonus;
    }

    public int getPrize() {
        return prize;
    }
}

 

Iterator

✔️ List<> 가지고 있는 객체 순회하기

  • Lottos 객체

public Iterator<Lotto> iterator() {
	return purchaseNumbers.iterator();
}

 

  • Lottos에서 순회하면서 Lotto 가져오기
public void getResult(WinningLotto winningLotto, Lottos purchaseLotto) {
        for (Iterator<Lotto> it = purchaseLotto.iterator(); it.hasNext(); ) {
            Lotto lotto = it.next();
            Rank rank = winningLotto.oneCompare(lotto);
            if (result.containsKey(rank)) {
                result.put(rank, result.get(rank) + 1);
                continue;
            }
            result.put(rank, 1);
        }
 }

 

 

Map

✔️ HashMap에서 key로 value 업데이트

 1) key에 대한 value 업데이트

Map<String, Integer> map = new HashMap<>();
map.put("ONE", 1);
map.put("TWO", 2);

// update
map.put("ONE", 5); // map.get("ONE") => 5

key가 HashMap에 존재하지 않는 경우에는 key와 value를 추가하고 이미 존재할 경우 값이 업데이트된다. (덮어씀)

 

 

2) key에 대한 value 값 증가

Map<String, Integer> map = new HashMap<>();
map.put("ONE", 1);
map.put("TWO", 2);

// update
map.put("ONE", map.get("ONE") + 5); // map.get("ONE") => 6
반응형

댓글