WIL-2_알고리즘(1)

신경연·2023년 2월 8일
0

WIL

목록 보기
5/6

이번주는 알고리즘을 집중하여 진행하였고, 문제를 풀면서 자바에서 제공하는 함수들을 최대한 활용하여 익숙해지는 것에 집중했다.

이유는 알고리즘을 풀면서 활용함으로써 함수에 익숙해질 수 있고, 문제풀이를 완료한 후 볼 수 있는 다른 사람들의 코드에서 내가 모르던 함수들도 많이 발견할 수 있기 때문에 지금이 가장 공부하기 좋을 것 같다고 생각했다.

그리고 다른 관점으로는 어떠한 기능을 구현하기 위해 여러 줄의 코드를 통해 구현하는 것보다 함수를 활용하는 것이 가독성이 좋을 것이라 판단했고, 이는 앞으로 진행할 프로젝트에서 중요할 것이라 생각했다.

새로 알게 되었거나, 안익숙한 함수들을 나중에 혹시 잊어버렸을 때 다시 상기할 수 있도록 모았다. 람다식의 경우는 나중에 제대로 익히고 쓰는게 나을 것 같아서 다른 방법을 모색하였다.

Arrays

Arrays.copyOfRange(arr, int from, int to)

[문제] K번째수

배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.

예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면

array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다.

int[] arr = Arrays.copyOfRange(array, commands[i][0]-1, commands[i][1]);

배열의 일부 범위만을 클론 하고 싶을 때 사용한다. 범위의 끝은 세지 않는 것에는 조심하자.

Arrays.stream()

람다식을 쓰지 않고도 사용할 수 있는 stream 기능이 조금 있었다.

int max = Arrays.stream(score).max().getAsInt();
int sum = Arrays.stream(selected).sum();

String

compareTo(String s)

[문제] 문자열 내 마음대로 정렬하기

  • 문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다.
  • 인덱스 n의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열이 앞쪽에 위치합니다.
@Override
public int compare(String o1, String o2){
    if(o1.charAt(n) == o2.charAt(n)){
        return o1.compareTo(o2);
    }
    return o1.charAt(n) - o2.charAt(n);
}

compareTo를 하면 두 String 간의 사전순 비교를 진행해 준다.

String.join(String[] arr)

String 배열을 String으로 만들어 준다.

str = String.join("", arr);

toLowerCase()

contains(String s)

replaceAll("정규식", "");

[문제] 신규 아이디 추천

아이디는 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.) 문자만 사용할 수 있습니다.
단, 마침표(.)는 처음과 끝에 사용할 수 없으며 또한 연속으로 사용할 수 없습니다.

answer = answer.toLowerCase();
answer = answer.replaceAll("[^a-z0-9._\\-]", "");
while(answer.contains("..")){

정규식 왠만하면 안쓰려 해봤지만 이정도는 알아두는 것도 좋다고 생각하여 사용해 보았다. replaceAll의 경우 정규식과 함께 많이 사용한다.
^은 not에 해당하여 위의 문자에 해당하지 않는 것들을 replace하게 된다.끝에 \는 -문자를 표기하기 위해 사용해 준다. 범위 -표시와의 구분.

Character

Character.isLowerCase(char c)

if (Character.isLowerCase(carr[i])) {
    new_char = (char) ((carr[i] + n - 'a') % 26 + 'a');
}
if(Character.isUpperCase(carr[i]))

boolean 형의 return 값을 가지고, 대소문자를 판단해준다.

Integer

진법 표현

[문제] 3진법 뒤집기

자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.

String three = Integer.toString(n, 3);
answer = Integer.parseInt(three, 3);

Hash

[문제] 위장

스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.

HashMap<String, Integer> hash = new HashMap<>();

for (String[] strings : clothes) {
    if(hash.containsKey(strings[1])){
        hash.put(strings[1], hash.get(strings[1]) + 1);
    }else{
        hash.put(strings[1], 1);
    }
}

for (int i : hash.values()) {
    answer *= i+1;
}

hash.values() : hashMap 안의 value들의 list를 반환
hash.containsKey() : hash가 해당 key를 가지고 있는지를 판단하여 boolean 값으로 리턴.

LocalDate

[문제] 2016년
두 수 a ,b를 입력받아 2016년 a월 b일이 무슨 요일인지 리턴하는 함수

LocalDate date = LocalDate.of(2016, a, b);
answer = date.getDayOfWeek().toString().substring(0, 3);

처음에 캘린더를 써봤는데, 실제 날짜와 비교해보니 요일이 안맞아서 알아보니 LocalDate를 많이 활용하는 듯하여 익혀놨다.
시간까지 활용하는 것은 LocalDateTime 이다.

profile
반갑습니다

0개의 댓글