본문 바로가기
ZB 백엔드 스쿨/주차별 정리

Pre 코딩테스트 2회차 회고 (2-1~2-5)

by son_i 2023. 8. 8.
728x90

2회차까진 수월했다 그래도 ㅎㅎ .... 

이번에도 강사님의 모범답안엔 스트림을 이용한 코드가 정말 많았다 ! 

또 한 번 배워간다.

 


Stream 관련 메소드

.boxed() : 기본형 객체를 Wrapper클래스로 변환해 줌.
ex) int형 배열 arr을 내림차순으로 정렬하고 싶을 때 Arrays.sort(arr, Collections.reverseOrder()); 하면 오류남 배열 arr을 Integer형으로 선언해줘야 하는데 입력 값으로 int형 배열이 지정되어 들어오는 경우 마음대로 바꿀 수가 없음. 이럴 때 .boxed()사용
arr=Arrays.stream(arr).boxed().sorted(Collections.reverseOrder()).mapToInt(x->x).toArray();

.collect() : 최종연산 메소드로 스트림의 요소들을 여러 형태로 수집.
ex_ 배열에서 중복 값을 제외한 요소의 갯수를 알고싶으면
int cnt = Arrays.stream(arr).collect(Collectors.toSet()).size(); 로 가능.

.chars() : 문자 스트림으로 변환해 주는 메소드

 

* 문자열 s에서 중복을 제외한 단어의 수 구하기 (단어는 공백으로 구분)

String arr[] = s.split(" ");return Arrays.stream(arr).collect(Collectors.toSet()).size(); 이렇게 해도 되는데

 

return Arrays.stream(s.split(" ")).collect(Collectors.toSet()).size(); 이렇게 하면 한 줄로 가능 .. ! 대박

 


XOR 다시보기

XOR은 정말 엄청난 특징이 있었다.

= > 짝을 이루는 것을 없애고 짝이 안 맞는 값만 남긴다는 것 !

원래도 비트 연산으로 같으면 0 다르면 1이라는 것은 알고있었는데 이걸 전혀 어디에 응용할 줄 몰랐다.

근데 예전 행성 X3 문제에서도 모든 행성민끼리의 친밀도를 구했었는데 XOR 연산을 해서 

  - > 모든 수들의 각 자리의 비트 1 갯수, 0 갯수를 곱해주면 해당 비트의 총 경우의 수가 된다.

예를들어 1, 1, 0 이 2^0의 각 숫자의 비트였다고 하면 어떻게 조합을 하든 0, 1    1 , 1로 두 개의 경우의 수가 나온다.

이 경우 0, 1 일 때만 XOR 연산의 값이 1이다. 이때의 비트의 자릿수가 활성화 됨.

 이런식으로 1과 0의 갯수를 알면 해결 가능.

 

근데 이번 문제는 XOR을 통해 짝이 안 맞는 숫자를 찾아낼 수 있었음 !

return Arrays.stream(arr).reduce((x,y) -> x ^ y).getAsInt();

 

또 이진수 두 개 중에 하나를 다른 하나로 바꾸기 위해 변경해야하는 비트수를 구할 때

int val = A ^ B를 해서 1인 갯수만 세어주면 됨.. (다르면 1이니까)

 


정규표현식 Pattern, Matcher

이건 정말 처음 보고 처음 써보는 클래스였다.

*Pattern : 정규식을 정의하는데 사용

*Matcher : 정규식(패턴)을 데이터와 비교하는 역할

 

Pattern p = Patterns.compile("([0-9]+)"); //하면 숫자만 골라내는 패턴 생성

Pattern p1 = Patterns.compile("([+\\-*/])"); //하면 +-*/ 골라내는 패턴 생성

    -> 여기에 나는 역슬래쉬 두 개가 뭔가 진짜 한참 고민했는데 정규표현식에서 -가 어디서부터 어디까지의 의미로 쓰이는데 나는 저걸 기호 그대로 쓰고싶으니까 \하나 붙여줬는데 이것도\하나만 붙이면 확장문자로 인식이 돼서 하나 더 붙여 두 개 써준 거임 ! 두 개 쓰면 \\ 역슬래시 하나. \-는 -문자 그 자체 의미.

Matcher m = p.matcher(S); // s라는 문자열에서 pattern에 맞는 데이터만 m에 넣어줌.

while (m.find()) { //주어진 소스내에서 패턴과 일치하는 부분 찾으면 true

  System.out.println(m.group()); // 정규식의 그룹화. 매칭된 부분을 리턴

}

신기하다 ! 노션에 더 자세히 정리해놨다.

 


String 관련함수

너무 익숙한 String이지만 또 처음 알게된 메소드가 생겼다.

- String.startWith("a") : a로 시작하는 문자열인지 검증 !

- String.endWith("A") : A로 끝나는 문자열인지 검증 !

 


또 많이 성장한 한 주 였던 듯...

새로운 거 알게되니까 재밌긴한데 양이 너무 많이 들어와서 좀 버겁긴하다.

해야지 어쩌겠우 ㅋㅋ

 

코테 3차를 엄청나게 조져놨는데 얼른 공부하면서 리팩토링 다시 해야겠다 ~.~