메서드 정리

2023. 12. 4. 11:14· TIL
목차
  1. replace
  2. replace
  3. replaceAll
  4. replaceFirst
  5. Split
  6. Arrays.stream.mapToInt.toArray();
  7. List<Object>
  8. Integer.toBinaryString()
  9. contains()
  10. Date
  11. euclidean
  12. integerList.sort(Comparator.naturalOrder());
728x90
반응형

2023년 12월 01일 TIL

C로 알고리즘을 풀다가 자바로 넘어왔더니 구석기 살다 근현대로 넘어온 기분이었다.
Java에는 그 놈의 split을 포함한 정말 좋은 내장 메서드들이 많다.
이런 메서드를 써서 알고리즘을 푸는 행위가 과연
알고리즘을 푸는게 맞나 싶을 정도의 기분이 들 때가 있다.

오라클 JDK 9 공식문서

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 ... ) 까지만 작성해도
알아서 뒤를 뽑아주니까.

알고리즘은 풀면 풀 수록 실력이 늘어난다는 말이 사실이다.
메서드를 모르면 못 푸는 문제들이 많다.
이가 없으면 잇몸으로 푸는것도 한 두번이지
뒤로 갈 수록 잇몸으로는 시간 복잡도가 박살나버릴 때가 생기는데
이러면 " 이맞왜틀 " 로 멘탈이 흔들린다.
멍청해서 못 푸는게 아니라 공부가 부족한 것이니 괜찮다.
728x90
반응형
저작자표시 (새창열림)

'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
  1. replace
  2. replace
  3. replaceAll
  4. replaceFirst
  5. Split
  6. Arrays.stream.mapToInt.toArray();
  7. List<Object>
  8. Integer.toBinaryString()
  9. contains()
  10. Date
  11. euclidean
  12. integerList.sort(Comparator.naturalOrder());
'TIL' 카테고리의 다른 글
  • TIL
  • 알고리즘 테크닉 정리
  • 개인정보 수집 유효기간, 과제 진행하기
  • nbs Project
정유감
정유감
반응형
정유감
정말유감이야
정유감
전체
오늘
어제
  • 분류 전체보기 (57)
    • TIL (48)
    • KPT (4)
    • TMI (3)
    • BLOG (0)
    • DIARY (0)
    • 포스팅용 메모 (0)
    • AS (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 약수의 합
  • 에이닷
  • 백트래킹
  • isBefore
  • euclidean
  • Til
  • mapToInt
  • toBinary
  • 브루트포스
  • Comparator
  • 홀수 짝수
  • 완전탐색
  • 비트마스크
  • kpt
  • 하이퍼링크?
  • Summit
  • 순열
  • 자연수 뒤집어 배열로 만들기
  • contains
  • markdown

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.1
정유감
메서드 정리
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.