[Java Study] 프로그래머스 lv.1 3진법 뒤집기 (74%)

ayboori·2023년 7월 3일
0

Java Study

목록 보기
10/34

https://school.programmers.co.kr/learn/courses/30/lessons/68935

풀이 로직

  1. Stack을 사용해서 값을 거꾸로 꺼내기
  2. 3으로 계속 나눠주며 나머지를 스택에 넣기
  3. Math.pow를 사용하여 3의 n제곱을 곱해주기

n진법 전환하기

한 수를 n으로 계속 나눠주며 그 나머지를 얻는다.

Math.pow

Math.pow(제곱할 수, 지수)

나의 풀이

    public int[] solution(int []arr) {
        Stack<Integer> stack = new Stack<>(); // 가변 크기의 컬렉션으로 값 담기
        stack.push(arr[0]); // 비교를 위해 배열의 첫번째 값 넣기

        for(int i=0; i<arr.length; i++){ // 배열의 길이만큼 돌면서 비교
            if(stack.elementAt(stack.size()-1) != arr[i]){ // 바로 앞에 있는 stack의 값과 일치하지 않을 때만
                stack.push(arr[i]);  // stack에 값 추가
            }
        }

        int[] answer = new int[stack.size()]; // stack의 크기만한 int 배열 생성

        for(int i=answer.length-1 ; i>=0 ; i--){ // stack은 LIFO (후입선출)이므로 배열 맨뒤부터 값 넣어줌
            answer[i] = stack.pop();
        }
        return answer;
    }

통과 시간

0.12ms ~ 0.26ms
Stack을 사용해서 다른 팀원들보다 시간이 느린 것 같다
(다른 팀원들은 0.04ms ~ 0.10ms)

테스트 1 〉	통과 (0.11ms, 79.1MB)
테스트 2 〉	통과 (0.29ms, 71MB)
테스트 3 〉	통과 (0.33ms, 71.6MB)
테스트 4 〉	통과 (0.28ms, 77.6MB)
테스트 5 〉	통과 (0.26ms, 77.6MB)
테스트 6 〉	통과 (0.19ms, 76.6MB)
테스트 7 〉	통과 (0.28ms, 70.2MB)
테스트 8 〉	통과 (0.25ms, 78.4MB)
테스트 9 〉	통과 (0.24ms, 72.5MB)
테스트 10 〉	통과 (0.24ms, 78.2MB)
테스트 11 〉	통과 (0.18ms, 77.4MB)
테스트 12 〉	통과 (0.18ms, 73.9MB)
테스트 13 〉	통과 (0.24ms, 81.8MB)
테스트 14 〉	통과 (0.28ms, 74.4MB)
테스트 15 〉	통과 (0.26ms, 65.7MB)
테스트 16 〉	통과 (0.27ms, 75.3MB)
테스트 17 〉	통과 (0.11ms, 72.9MB)
효율성  테스트
테스트 1 〉	통과 (50.00ms, 120MB)
테스트 2 〉	통과 (47.65ms, 113MB)
테스트 3 〉	통과 (47.71ms, 111MB)
테스트 4 〉	통과 (48.90ms, 116MB)

다른 풀이를 보고 알게 된 점

1) List사용

List를 사용하면 통과 시간이 더 짧아진다는 사실은 지난번에 알았지만, 거꾸로 꺼내는 거 하면 스택이지! 해서 사용해보았다

2) 진법 변환 메소드 사용

  • 10진수 → n진수: Integer.toString(int a, int radix) (10진수는 뒤의 생략 가능)
    • 숫자를 문자열로 바꾸는 메소드로 10진수의 숫자를 n진법의 숫자로 바꿀 수 있음!
    • 2진수는 toBinaryString, 8진수는 toOctalString, 16진수는 toHexString으로도 표현 가능
    • Integer.toString 예시
int a = 7
String s = Integer.toString(7) // “7”
String s = Integer.toString(7, 3); // “0021”
  • n진수 → 10진수: Integer.parseInt(String s, int radix) (10진수는 뒤의 생략 가능)
    - 문자열을 숫자로 바꾸는 메소드로 n진법의 숫자를 10진법의 수로 바꿀 수 있음!
    - Integer.parseInt 예시
	String s = 0021
    int a = Integer.parseInt(s); // 21
    int b = Integer.parseInt(s, 3); // 7 

3) 뒤집기 메소드

뒤집을 것.reverse()

profile
프로 개발자가 되기 위해 뚜벅뚜벅.. 뚜벅초

0개의 댓글