2023년 12월 01일 TIL
C로 알고리즘을 풀다가 자바로 넘어왔더니 구석기 살다 근현대로 넘어온 기분이었다.
Java에는 그 놈의 split을 포함한 정말 좋은 내장 메서드들이 많다.
이런 메서드를 써서 알고리즘을 푸는 행위가 과연
알고리즘을 푸는게 맞나 싶을 정도의 기분이 들 때가 있다.
replace
replace
와 비슷한 기능을 하는 그 외에 메서드 replaceAll
과 replaceFirst
이 있다.
공식 문서에 따르면 replace
는 char
형태와 String
형태의 메서드 두개가 존재한다.
replace
replace (char oldChar, char newChar)
replace (CharSequence target, CharSequence replacement)
@override
는 아니고 단순히 char
를 바꿔주냐 String
을 바꿔주냐의 차이라서,
독립적인 메서드지만 사용법은 같다.
replaceAll
replaceAll
은 replace
와 별 다른 차이가 없다.
다만 replaceAll
은 정규 표현식을 사용할 수 있다는 차이가 있다.
String myString = "abc123abc";
replace("123", "**");
vs
String myString = "abc123abc";
replaceAll("\\d", "*");
둘의 결과는 같다.
-> abc**abc
replaceFirst
replace
와 replaceAll
은 해당하는 모든 문자나 문자열을 전부 바꿔준다
반면 replaceFirst
는 타겟 문자열에서 가장 처음으로 만나는 하나만 바꿔준다.
String myString = "abcabc";
replaceFirst("ab", "xy")
-> xycabc
Split
Split
은 아주 달달한 친구다.
String
을 분리 하여 String[]
으로 변환시킬때,
특히 시간이나 날짜를 나타내는 String
처리에는 이만한게 없다.
String myBirthday = "1994.06.23";
String[] birthdayArray = split(".");
정규 표현식으로도 이용이 가능한데
String myBirthday = "1994-06---23";
String[] birthdayArray = split("-+");
둘 모두 결과물은 아래와 같다.
-> birthdayArray : ["1994", "06", "23"]
- 를 하나 이상 ( + ) 연속 포함하는 String
을 기준으로 자르게 된다.C
를 사용하며 split
을 구현할때는 이렇게 정신 사나운 녀석이 없었으나Java
를 이용하며 아군이 되어주니 이렇게 든든한 녀석이 또 없다.
응용하자면 시간 형태로 들어오는 String
에 이렇게 대처 할 수 있다.
public int returnMinute(String s) {
String[] parts = s.split(":");
return Integer.parseInt(parts[0]) * 60 + Integer.parseInt(parts[1]);
}
Arrays.stream.mapToInt.toArray();
이전에도 다뤘지만 stream
은 편한 만큼 패널티가 확실한 녀석이다.List
를 Array
로 손쉽게 바꿔주긴 하지만 알고리즘에 이용해보면 그 속도 차이가
적게는 20배에서 많게는 400배까지 느려지는걸 확인했다.
그래서 보통 이용해야 할때는
List<Integer> myList = new ArrayList<>(); // 안에 뭔가 들어있다고 치고
int[] myArray = new int[myList.size()];
for (int i = 0; i < myList.size(); i++)
myArray[i] = myList.get(i);
return myArray;
형태로 조금 귀찮더라도 돌아가는 식으로 이용한다.stream
으로 작성하면 아래 한줄로 바뀐다.
return myList.stream().mapToInt(i -> i).toArray();
다만 Spring
으로 프로젝트를 진행할 때에는 시간 복잡도를 고려하기보단,
가독성을 중요시 하므로 stream
을 이용하게 되더라.
List<Object>
위의 문제를 풀기 위해 String
과 int
, int
셋이 묶인 배열이 필요했다.map
을 사용할까 하다가 사용하기 복잡할 것 같아 Plan
이라는 구조체를 하나 만들어
배열처럼 이용했었다.
class Plan {
String subject;
int timeInMinute;
int duration;
public Plan(String subject, int timeInMinute, int duration) {
this.subject = subject;
this.timeInMinute = timeInMinute;
this.duration = duration;
}
}
알고리즘 스터디를 하면서 배웠는데, List<Object>
형태로 List를 만들게 되면
안에 int
와 String
등 다양한 Object
하위 형태를 모두 넣을 수 있다고 하더라.
내가 순서만 기억하여 잘 사용할 수 있다면 위와 같이Plan
을 만드는 귀찮음을 수행하지 않더라도 같은 효과를 낼 수 있을 듯 하다.
다만 가독성 부분에서 구조체를 하나 만드는 행위가 결코 잘못되었다고 보진 않는다.
알고 있음에 따라 유연하게 사용하면 된다고 생각한다.
다만 List<Object>
에 넣은 값들은 불러올때 캐스팅을 해줘야한다.
Integer.toBinaryString()
해당 int
를 2진법
으로 변환해 그것을 String
형태로 반환해주는 메서드이다.
이딴게 세상에 존재한다면 알고리즘을 뭐하러 풀지?
현타가 싸악~ 오는 메서드이다.
int number = 10;
String binaryString = Integer.toBinaryString(number);
이 때,
binaryString : "1010"
헌데 3진법부터는 어떻게 하느냐?
Integer.toString( i n t , 8)
우측에 원하는 진법 숫자를 넣어주면 해당하는 진법의 String
을 반환해준다.
C
틀딱 입장에선 뒷목 잡을 메서드이다.
나는 더 이상 java
없이는 알고리즘을 못 푸는 몸이 되어버렸다...
contains()
메서드 이름 그대로 String
안에 해당하는 String
이 포함되는지 확인하는 메서드이다.Boolean
형태를 반환한다.
String str = "Hello, world!";
boolean result = str.contains("world");
이 때,
System.out.println(result);
-> true
비슷한 메서드로 isEmpty
를 들 수 있지 않을까
Map
에서 containsKey
같이 사용할 수 있는 응용이 많다.
이름을 참 잘 지어둔것 같다.
Date
Date
타입을 자주 써먹게 되었는데,plusMonths
, isBefore
처럼 이름만 읽어도 어디다 써먹는지 알것 같은 메서드와isEqual
처럼 익숙하지만 이곳에도 사용할 수 있는 메서드가 있었다.
각각 Date에 'int'타입의 개월을 더한 Date
타입을 반환,
각 Date
관계가 과거인지, 오늘인지 를 Boolean
으로 반환하는 메서드이다.
사용해보진 않았지만 plusMonths
는 Years나 Days
혹은 Times
... 등도 존재 할듯?
euclidean
그냥 유클리드법으로 만드는 최소 공배수와 최대 공약수를 찾는 방법이다.
제공되는 메서드는 아니나 가끔 써먹어야 할 때가 나오는데 그 때마다 찾아 푸느니 외우자.
public int[] solution(int n, int m) {
int gcd = euclidean(n, m);
int lcm = n * m / gcd;
return new int[]{gcd, lcm};
}
public int euclidean (int n, int m) {
int j = 1;
while ( j > 0 ) {
j = n % m;
n = m;
m = j;
}
return n;
}
integerList.sort(Comparator.naturalOrder());
이름이 좀 긴데 integerList
라는 이름의 List
를 오름차순으로 sort
해준다.
꼭 외우진 않더라도 기억해두면 나중에 쓸 일이 있다.IDE
를 이용할 수 없는 코테라면 모를까 .sort(C ... ) 까지만 작성해도
알아서 뒤를 뽑아주니까.
알고리즘은 풀면 풀 수록 실력이 늘어난다는 말이 사실이다.
메서드를 모르면 못 푸는 문제들이 많다.
이가 없으면 잇몸으로 푸는것도 한 두번이지
뒤로 갈 수록 잇몸으로는 시간 복잡도가 박살나버릴 때가 생기는데
이러면 " 이맞왜틀 " 로 멘탈이 흔들린다.
멍청해서 못 푸는게 아니라 공부가 부족한 것이니 괜찮다.
'TIL' 카테고리의 다른 글
TIL (0) | 2023.12.06 |
---|---|
알고리즘 테크닉 정리 (0) | 2023.12.05 |
개인정보 수집 유효기간, 과제 진행하기 (1) | 2023.11.30 |
nbs Project (0) | 2023.11.21 |
SK TECH SUMMIT (0) | 2023.11.16 |