본문 바로가기

항해99

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

오늘 공부한 것

* 알고리즘 문제풀이

* 3주차 강의 복습

* 3주차 강의 학습

 

오늘도 열심히 알고리즘을 풀었다

난이도는 점점 어려워졌다 문제자체가 이해안가는 부분들이 생겼고

그런만큼 어떤 코드를 사용해야 할지도 어려웠다

 

문제13 콜라츠 추측
문제 설명
1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될 때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같습니다.

1-1. 입력된 수가 짝수라면 2로 나눕니다.
1-2. 입력된 수가 홀수라면 3을 곱하고 1을 더합니다.
2. 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다.
 
예를 들어, 주어진 수가 6이라면 6 → 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1 이 되어 총 8번 만에 1이 됩니다. 위 작업을 몇 번이나 반복해야 하는지 반환하는 함수, solution을 완성해 주세요. 단, 주어진 수가 1인 경우에는 0을, 작업을 500번 반복할 때까지 1이 되지 않는다면 –1을 반환해 주세요.
class Solution {
    // input
    // num
    //
    // 계산
    // num % 2 = 0 짝수
    // num % 2 = 1 홀수 * 3 +1
    //
    // output
    // 반복 횟수
    // 반복 횟수== 500 일땐 -1
    public int solution(long num) {
        int answer = 0; // 반복 횟수
        while (num != 1) {
                if (num % 2 == 0) { //6 % 2=0 짝수
                    num /= 2; // 6/2 = 3
                    answer++;
                } else {
                    num = num * 3 + 1;   // 3*3+1= 10
                    answer++;
                }
                if (answer == 500) {
                    answer=-1;
                    break;
                }
            }
        return answer;
        }
    }

 

문제14 서울에서 김서방 찾기
문제 설명
String형 배열 seoul의 element중 "Kim"의 위치 x를 찾아, "김서방은 x에 있다"는 String을 반환하는 함수, solution을 완성하세요. seoul에 "Kim"은 오직 한 번만 나타나며 잘못된 값이 입력되는 경우는 없습니다.
class Solution {
    // input
    // String [] seoul
    //
    // 계산
    // 배열에서 특정 값 찾기 
    // for, if 사용
    //
    // output
    // 배열상 "kim" 위치
    // "김서방은 몇번째 위치에 있다"
 public String solution(String[] seoul) {
        String answer = "";

        for(int i=0; i<seoul.length; i++) {
            if(seoul[i].equals("Kim")) {
                answer = "김서방은 " + i + "에 있다";
            }
        }

        return answer;
    }
}

 

문제15 나누어 떨어지는 숫자 배열
문제 설명
array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요.
divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.
import java.util.ArrayList;
import java.util.Arrays;
class Solution {
  // input
    // 배열의 요소
    //
    // 계산
    // 배열에 있는 수를 랜덤 divisor 로 나눔
    // 배열에 있는 수중 divisor로 나누어서 떨어지는 값을 배열로 리턴
    // 예 [5,9,7,10] 중 divisor가 5일때 나누어 떨어지는 [5,10] 을 리턴
    // int 배열을 list 로 변환필요
    // 변환한 것을 % divisor == 0 일때 배열에 담기
    // 0 이라면 -1  배열에 담기
    //
    // output
    //divisor로 나누었을 때 떨어지는 원소를 배열로 리턴

    public int[] solution(int[] arr, int divisor) {
        int[] answer = {};
        ArrayList<Integer>list = new ArrayList<Integer>();

        for (int i = 0; i < arr.length; i++) {
            if (arr[i] % divisor == 0) { //배열 값이 divisor로 나누어 떨어지면
                list.add(arr[i]); //리스트 저장
            }
        }
        if (list.size()==0){ // 리스트 크기가 0인경우
            list.add(-1);   // - 1 저장
        }
        answer = new int[list.size()]; // 만든 list 크기 만큼 answer 생성

        for(int i=0; i< list.size(); i++){ // list 값 answer에 복사
            answer[i] = list.get(i);
        }
            Arrays.sort(answer);//answer를 오름차순 정렬
        return answer;
        }
    }

 

문제 16에서는 배열이 두개가 나왔다

int배열과 boolean 배열이 함께 나와서 고민이 많았다

이걸 변환을 해야하나? 라는 고민이었다

하지만 막상 해보니 변환하지 않아도 할 수 있어서 다행이었다

문제16 음양 더하기
문제 설명
어떤 정수들이 있습니다. 이 정수들의 절댓값을 차례대로 담은 정수 배열 absolutes와 이 정수들의 부호를 차례대로 담은 불리언 배열 signs가 매개변수로 주어집니다. 실제 정수들의 합을 구하여 return 하도록 solution 함수를 완성해주세요.
class Solution {
     // input
    // 정수배열 absolutes
    // 정수배열의 부호를 담은 불리연 배열 signs
    //
    // 계산
    // 배열끼리 대조해서 + 인지 -인지 확인
    // 확인 후 SUM
    //
    // output
    // signs으로 부호 확인해서 absolutes의 합계 구하기

    public int solution(int[] absolutes, boolean[] signs) {
        int answer = 0;

        for(int i=0; i<absolutes.length; i++){
            if (signs[i]==true){ //부호 배열에서 true 면 +
                answer += absolutes[i];
            } else {             //부호배열에서 false 면 -
                answer -= absolutes[i];
            }
        }
        return answer;
    }
}

 

문제 17에서는  전화번호의 뒷 4자리를 제외한 나머지 숫자를 * 로 바꿨어야 했다

뒷 4자리를 제외한 나머지 숫자를 어떻게 해야 하는가 고민이 많았는데

전체 길이에서 -4를 빼면 되는거였다 고민을 오래했는데 생각보다 쉬웠다..

문제17 핸드폰 번호 가리기
문제 설명
프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다.
전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요.
class Solution {
    // input
    // 문자열 phone_number
    //
    // 계산법
    // phone_number의 뒷자리 -4 만 숫자로 살리기
    //
    // ouput
    // 뒷 4자리를 제외한 나머지 숫자를 *로 변환
    public String solution(String phone_number) {
        String answer = "";
        for (int i = 0; i < phone_number.length(); i++) {
            if (i < phone_number.length() - 4) { // phone_number의 길이에서 -4를 뺀수
                answer += "*";
            } else {
                answer += phone_number.charAt(i);
            }
        }
        return answer;
    }
}

 

문제 18에서의 고비는 배열에 없는 숫자를 찾아 더한 수를 표현하는것이었다

이걸 어떻게 해야할까 고민하다가 팀원에게 의논해보니

0~9까지 다 더한 45에서 for문으로 나오는 숫자를 계속 빼는게 어떻겠냐고 들었고

머리가 확 밝아지면서 해결할 수 있었다.

문제18 없는 숫자 더하기
문제 설명
0부터 9까지의 숫자 중 일부가 들어있는 정수 배열 numbers가 매개변수로 주어집니다. numbers에서 찾을 수 없는 0부터 9까지의 숫자를 모두 찾아 더한 수를 return 하도록 solution 함수를 완성해주세요.
class Solution {
  // input
    // int[] numbers
    //
    // 계산
    // 0~9 다 더 하면 45 여기에서 있는 숫자를 뺀다
    // 45 에서 배열에 있는 숫자를 for문으로 계속뺌
    //
    // output
    // numbers에서 찾을 수 없는 0~9 까지 숫자의 sum
    // answer += ?

    public int solution(int[] numbers) {
        int answer = 45;
        for (int i=0; i<numbers.length; i++){
            answer-=numbers[i];
       }
        return answer;
    }
}