본문 바로가기

항해99

23.08.19 항해 99 16기 프로그래밍 기초2 2일차

오늘 공부한것

* 알고리즘 문제풀이

* 3주차 강의 복습

 

어제보단 알고리즘을 푸는게

어제보다는 조금 더 수월했다

조금씩 방법을 알아가는 느낌이랄까?

익숙해지는 느낌이 아주 좋았다

 

문제는 코딩도 문제지만 

코딩테스트에서 나오는 문제들이 수학적으로 풀어야 하는것들이있어서

그 부분들을 생각하는것도 힘들었다 

 

문제7은 오늘 풀었던 문제 중에 가장 힘들고 복잡했던 문제였다

자연수를 뒤집는 것, 그리고 이것을 배열로 만드는 것

그것을 return 하는 것 모두가 쉽지 않았다

역시 구글링이 최고였다!!

하나 하나 짜맞추면서 해보니 다행히 풀렸다

문제7 자연수 뒤집어 배열로 만들기
문제 설명
자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.
import java.util.ArrayList;
class Solution {
// input
    // 자연수 n
    //
    // 계산
    // 자연수 n을 뒤집기 reverse()
    // 숫자->문자열  "".toString or String.valueOf()
    // 뒤집은거 배열화 필요
    //
    // output
    // 자연수 n을 뒤집어 각자리 숫자를 원소로 가지는 배열
    public int[] solution(long n) {
            ArrayList<Integer> arrInt = new ArrayList<>(); //Array list 형 자료구조 개체 만듬
            StringBuilder strReverse = new StringBuilder(String.valueOf(n)); //reverse 사용하기 위해 StringBuilder 클래스 생성, 숫자n을 문자열로 변경
            strReverse = strReverse.reverse();//문자열n을 뒤집기
            for (int i = 0; i < strReverse.length(); i++)
                arrInt.add(Integer.parseInt(String.valueOf(strReverse.charAt(i)))); //charAT 문자열 안에 몇번째 문자인지를 char 형으로 가지고옴 add 가 저장 문자열n 뒤집기까지
        return arrInt.stream().mapToInt(i->i).toArray(); // mapToInt = Interger 를 int로 바꿔서 toArray 배열을 만들어줌
       
    }
}

 

문제8은 사실 엄청 쉬운 문제였다

하지만 나는 제한조건의 함정에 빠져버렸다

밑의 제한 조건을 로직으로 짜는데 

이것까지 고려할 필요가 없었던 것이다.

제한조건

1) s의 길이는 1이상 5이하

2) s의 맨앞에는 부호(+,-)가 올 수 있습니다

3) s는 부호와 숫자로만 이루어져잇습니다

4) s는 "0" 으로 시작하지 않습니다.

문제8 문자열을 정수로 바꾸기
문제 설명
문자열 s를 숫자로 변환한 결과를 반환하는 함수, solution을 완성하세요.
class Solution {
    public int solution(String s) {
        int answer = 0;
        return Integer.parseInt(s);
    }
}

 

문제9 정수 제곱근 판별
문제 설명
임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.
class Solution {
    // input
    // long n
    //
    // 계산
    //  예) 11의 제곱은 121 이므로 제곱근=11 11은 x 121은 x 제곱
    //
    // output
    // n 제곱근 = x+1의 제곱
    // n != 제곱근 = -1

    
    public long solution(long n) {
        long answer = 0;
        long x = (long)Math.sqrt(n); // n의 제곱근
        if (x * x == n) { // 실수인지 정수인지 판별
            answer = (long) Math.pow((x + 1), 2);
        }  else {
            answer =-1; // -1 리턴
        }

        return answer;
    }
}

 

문제10 정수 내림차순으로 배치하기
문제 설명
함수 solution은 정수 n을 매개변수로 입력받습니다. n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요. 예를들어 n이 118372면 873211을 리턴하면 됩니다.
제한 조건
import java.util.Arrays;
import java.util.Collections;
class Solution {.
    // input
    // n
    //
    // 계산
    // 숫자 -> 문자열 String.valueOf
    // 배열 사용
    // 문자열 ->숫자
    //
    // output
    // n의 각자리수를 큰것부터 작은순으로 정렬한 정수
    public long solution(long n) {
        long answer = 0;
        String str = Long.toString(n); // 숫자->문자열
        String [] list = str.split(""); // .split("") 특정 문자열을 분리해서 배열로 만듬
        Arrays.sort(list, Collections.reverseOrder()); // 내림차순 정렬
        str = String.join("", list); // 분리한 문자열을 하나의 문자열로 만듬
        answer = Long.parseLong(str);


        return answer ;
    }
}

 

문제11 하샤드 수
문제 설명
양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.
class Solution {
 public boolean solution(int x) {
        boolean answer = true;
        int sum=0;
        String numStr = String.valueOf(x); // 숫자를 문자열로 변경 12를  "12"로 변경
        String [] str = numStr.split(""); // 문자열을 나누어 배열에 저장 ["1", "2"]
        for (String num : str){
            sum+= Integer.parseInt(num); // 문자열을 숫자로 변환
            if (x%sum==0){
                answer = true;
            }else {
                answer = false;
            }
        }

        return answer;
    }
}

 

문제12 두 정수 사이의 합
문제 설명
두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수, solution을 완성하세요.
예를 들어 a = 3, b = 5인 경우, 3 + 4 + 5 = 12이므로 12를 리턴합니다.
class Solution {
    // input
    // int a, int b
    //
    // 계산
    // a=3 , b= 5
    // 3+4+5=12
    //
    // output
    //
    //answer = a와 b 사이에 속한 정수의 합을 리턴
    public long solution(int a, int b) {
        long answer = 0;
        int max = Math.max(a, b);
        int min = Math.min(a, b);

        for (int i=min; i<=max; i++){
            answer += i;
        }

        return answer;
    }
}