TIL_240213

라미·2024년 2월 13일

TIL

목록 보기
12/25
post-thumbnail

이번주부터 알고리즘 주간이라 알고리즘 문제 풀이를 했다.
프로그래머스 문제풀이 git repo


int vs long

  • 결과값이 int의 범위를 벗어나는 경우가 있어서 long으로 해주면 좋다.

Array 오름차순 정렬 vs 내림차순 정렬

오름차순 정렬

Array.sort() : 배열을 인자로 전달하면 오름차순으로 정렬된다.

  • sort() 함수 내부에서 변수의 순서를 변경해주기 때문에 리턴 값을 다른 변수에 할당할 필요가 없다.
  • 원본 배열의 순서가 변경된다.
❤️ 예시코드
int[] arr = {1,5,3,8,6,7,0};
Arrays.sort(arr);
System.out.println("오름차순 : "+Arrays.toString(arr));
📃 실행결과

오름차순 : [0, 1, 3, 5, 6, 7, 8]

내림차순 정렬

Arrays.sort(배열명, Collections.reversOrder()) : sort() 함수 인자에 파라미터로 Collections.reverseOrder()를 전달해 줘야한다.

  • Collection.reverseOrder() 는 원시 자료형이 아닌 객체 타입에 사용된다. 따라서 Wrapper 클래서 또는 다른 객체 타입을 사용해야한다.
❤️ 예시코드
<// 내림차순 정렬 1
Integer[] arr = {1,5,3,8,6,7,0};
Arrays.sort(arr, Collections.reverseOrder());
System.out.println("내림차순 : "+Arrays.toString(arr));

// 내림차순 정렬 2
// int 배열을 Integer 배열로 변경한 뒤 Collections.reversOrder() 사용
int arr2[] = {1,5,3,8,6,7,0};
Integer[] tmp = Arrays.stream(arr2).boxed().toArray(Integer[]::new);
Arrays.sort(tmp, Collections.reverseOrder());
System.out.println(Arrays.toString(tmp));

//내림차순 3
//int 배열에 -1 곱해서 저장후 sort 한 뒤 -1 곱하여 출력
int[] arr3 = {-1,-5,-3,-8,-6,-7,-0};
Arrays.sort(arr3);
System.out.println(Arrays.toString(arr3));
for(int i = 0; i < arr3.length; i++){
    arr3[i] = -arr3[i];
}
System.out.println(Arrays.toString(arr3));
📃 실행결과

내림차순 : [8, 7, 6, 5, 3, 1, 0]
[8, 7, 6, 5, 3, 1, 0]
[-8, -7, -6, -5, -3, -1, 0]
[8, 7, 6, 5, 3, 1, 0]

문제풀기

문자열을 정수로 바꾸기

❤️문제

문자열 s를 숫자로 변환한 결과를 반환하는 함수, solution을 완성하세요.

📝풀이

<//풀이
class Solution {
    public int solution(String s) {
        int answer = 0;
        // System.out.println(Integer.parsInt());
        return Integer.parseInt(s);
    }
}

👍새로 알게 된 점

- Integer.parseInt() 를 사용하면 부호도 변환 되는 건지 몰랐는데 함께 변환 되었다. 
아주 코드가 간단하게 해결 되었따.

📝다른 풀이

//다른 풀이
class Solution {
    public int solution(String s) {
        boolean sign = true;
        int result = 0;

        //str.charAt(0) 문자열 가장 첫번째 글자 부호 or 숫자인지 확인
        if(str.charAt(0) == '-'){ // 음수라면 sign 은 false
            sign = false;
        } else if (str.charAt(0) != '+') { // 음수도 아니고 양수도 아니라면 '0' 을 빼줘서 숫자로 만들어주기(아스키 코드 이용)
            result = str.charAt(0) - '0';
        }

        for (int i = 1; i < str.length(); i++) {//string index 0 번째는 부호체크를 했기 때문에 1부터 시작
            char ch = str.charAt(i);
            result = result * 10 + (ch - '0');
        }

        return sign ? result : -result;
    }
}

👍새로 알게 된 점

- 아스키 코드를 사용하여 문자 → 숫자로 변환
- 문자('0'(48)~'9'(57)) 이기 때문에 문자타입의 숫자를 숫자로 변환하기 위해서는 '0' 을 빼주면 된다.
- 'A' : 65 / 'a' : 97 (32 차이)

정수 제곱근 판별

❤️문제

임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, 
n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.

📝풀이

//풀이
class Solution {
     public long solution(long n) {
        long answer = 0;

        long square = (long) Math.sqrt(n); //제곱근 구하기
        answer = (square * square) == n ? (square+1)*(square+1) : -1;

        return answer;
    }
}

📝다른 풀이

//다른 풀이
class Solution {
  public long solution(long n) {
      if (Math.pow((int)Math.sqrt(n), 2) == n) {
            return (long) Math.pow(Math.sqrt(n) + 1, 2);
        }

        return -1;
  }
}

👍새로 알게 된 점

- Math.sqrt(), Math.pow() 메서드
- 두 메서드를 사용해서 코드를 엄청 간결하게 줄였다.

Math.sqrt() & Math.pow()

Math.sqrt() : 주어진 숫자의 제곱근을 계산
double result = Math.sqrt(숫자);

  • 양수 or 0을 매개변수로 전달받으며 double 값을 반환한다.
  • 음수를 매개변수로 전달할 시 NaN(Not a Number)이 반환된다.
  • 반환값은 주어진 숫자의 양의 제곱근이다.

Math.pow() : 주어진 밑의 거듭제곱을 계산
double result = Math.pow(밑, 지수);

  • 첫 번째 매개변수는 밑이고, 두 번째 매개변수는 거듭제곱 지수이다.(2(밑)의 3(지수)승)
  • 반환값은 doble 형식이고, 밑의 지수승을 나타내는 결과이다.
public static void main(String args[]) {
    double number = 25.0;
    double squareRoot = Math.sqrt(number);
    System.out.println("제곱근: " + squareRoot);

    double result = Math.pow(5, 3);
    System.out.println("제곱: " + result);
}
📃 실행결과
제곱근: 5.0
제곱: 125.0

0개의 댓글