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

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

by son_i 2023. 7. 28.
728x90

문제는 공유불가라 올릴 수 없지만 새로 안 사실이 너무 많아서 신나서 쓴다 !!!

나도 어렵지 않게 풀었던 문제들이지만 더 간단하게 풀 수 있었던 사실 !!!!!

 

* StringBuilder 다시 보기

나는 이제껏 .append()로 값들을 이어서 빠르게 출력해줄 때만 사용했었는데 기능들이 정말 많았다.

- sb.append("*".repeat(5)); 하면 *을 5번 sb에 넣어준다 !!! 와웅

-sb.reverse(); //문자열 뒤집기

  문자열이 들어왔을 때 뒤집어서 출력하는 것 같은 경우에 나는 스택에 넣어서 꺼내는 방식을 썼는데

StringBuilder를 사용하면 한 줄로도 가능했다.

String s = "apple";
StringBuilder sb = new StringBuilder(s);
return sb.reverse().toString();

이렇게도 할 수 있다는 거 첨 알고 정말 ㅜ 신문물 발견한 원시인 같이 소리냈다.

여기서 reverse()에 toString까지 !!! 

또 알게된게 StringBuilder 생성할 때 괄호안에 초깃값을 넣어줄 수 있다. 그럼 sb는 애초에 s라는 문자열이 들어가있음..

 

그리고 

int a = 10

int b = 5 일때 단순히 105로 이어서 출력하고 싶으면 이럴 때도 StringBuilder이용 !

 


마법같은

Integer.parseInt

나는 단순히 문자열 -> 정수로 변환해줄 때만 사용했었는데

10진수 문자열 s를 2진수 int형으로 바꿀 때

- Integer.parseInt(s, 2); 해주면 걍 끝남.......

16진수 문자열 s를 2진수 문자로 변환해줄 때는

 1. int num = Integer.parseInt(s, 16); // 16진수 문자열을 16진수 int형태로 변환

 2. Integer.toBinaryString(num); //16진수 int형을 2진수 문자열로 변환 !!!!

 


알수록 신기한 Stream

- 스트림으로 최소값 뽑아내기

 1. int arrResult[] = Arrays.stream(arr).sorted().toArray();

 이러면 arrResult[0] 이 최소값이고

 2. int answer = Arrays.stream(arr).min().getAsInt(); 

이렇게하면 arr배열 안에서 최소값을 answer에 저장 !

 

- 여러 요소들을 xor해서 10진수 출력할 때

Arrays.stream(arr).mapToInt(s -> Integer.parseInt(s,2).reduce((x,y) -> x ^ y).getAsInt();

 1. 배열을 스트림만들고

 2. s문자열을 2진수 정수로 반환

 3. 연쇄연산 다음요소와 계속해서 XOR 연산

 4. int형으로 변환

한 줄로 끝낼 수 있다 .. !!!!!

 

- stream().boxed()

 stream에는 객체와 클래스 타입만 들어갈 수 있는데 boxed()메소드는 원시타입들을 클래스 타입으로 바꿔줘서 스트림에 담길 수 있게한다.

int[] A

Arrays.stream(A).boxed().sorted((x,y) -> y - x); 정렬한 거

근데 하나도 정렬이 안 됐다 뭐지 ?

A = Arrays.stream(A).sorted().toArray(); 하면 정렬된게 저장되긴 함..


Character 메소드

- isDigit(c) : 해당 문자가 숫자인지 판별


String 메소드

코딩테스트 이후에 알게되었는데 복습하다가 이거 이용하는 문제가 나와서 다시한 번 써본다.

- String.join(구분자, 배열/리스트) : 배열/리스트의 값을 구분자로 구분하여 뽑아줌.

1. 이렇게 하면 String배열에 담긴 문자열들을 반복문 돌리지 않아도 공백없이 하나의 문자열로 이어줄 수도 있고

2. 문자열들을 ,로 구분해서 하나의 문자열로 만들어 줄 수도 있다 !


정규표현식

알고리즘 풀 때 슬쩍슬쩍 필요해서 그때마다 찾아쓰긴 했는데 귀찮아서 확실히 짚고 넘어가진 않았다.

그런데 더는 미룰 수 없을 것 같다. 언제까지  하나씩 찢어서 숫자인지 영문자인지 기호인지 비교할 건가 

- s.replaceFirst("^0*","");

이라는 코드가 있었는데 ^의 의미는 시작 *는 없을 수도 있고 많을 도 있다는 말

따라서 이 문자열에서 0으로 시작하는 첫 번째 요소를 빈칸으로 == 없애버린다는 의미.

 

뭐가많긴한데 기본적인 거 외에는 그때그때 필요한 거 익히면 될 것 같다.

^[0-9]*$ 숫자만
^[a-zA-Z]*$ 알파벳만
^[가-힣]*$ 한글만
^[a-zA-Z0-9]*$ 알파벳이나 숫자만
^[a-zA-z0-9]+@[a-zA-Z0-9]+\\.[a-z]+$ 이메일
\w+@\w+\.\w+(\\.\\w+)? 이메일(\ <<= 확장문자)
^01(?:0|1|[6-9])-(?:\\d{3}|\\d{3})-\\d{4}$ 핸드폰번호
^ 시작
[] 괄호 안 의 형식이 일치되어야한다.
- ex) 0,1,2,3,4,5,6,7,8,9 => 0-9
* 없을수도 많을수도 있다. ex) [0-9]* => 1237999 0,4,6,8 처럼 없을 수도 9 처럼 여러개있을 수도.
$
. 정해지지 않았으나 문자 하나만 허용
? 앞 문자가 없거나 하나 있음
[^] 괄호 속 맨 앞에 ^가 있으면 not을 뜻함. ex) !=에서 !와 같은 역할이라 보면 됨
{n} 횟수나 범위를 뜻함
{n.} 최소한 n개
() 소괄호 안에는 하나의 문자로 인식(그룹핑)
| 패턴 안에서 or연산
\s 공백문자
\S 공백문자가 아닌 나머지 문자
\w 알파벳이나 숫자, 언더바를 찾음
\W 알파벳이나 숫자,언더바를 제외한 문자.
\d [0-9]와 동일
\D 숫자를 제외한 모든 숫자

원래 내가 알고있던 세상이 무너지는게 싫어서 복습을 싫어했는데 저번 미니과제부터 알아가는게 정말 많아서 !!

푸는 법이 꼭 아니어도 세세한 내가 몰랐던 메소드 같은 거 알아갈 수 있어서 너무 재밌고 좋다 !!!! 😆😆😆

순식간에 1-1부터 1-5까지 25문제 리팩토링 했다 .. 물론 한 다섯시간 걸리긴 했음 ㅋ