이노베이션 캠프 W2

KIM YOUJEONG·2022년 7월 28일
0

이노베이션 캠프

목록 보기
2/6

[Chapter 2] 프로그래밍 기초 (W2)


2주차는 알고리즘 스터디로 진행됐다

🗝️ OOP?

Opject-Oriented Programming, 객체지향 프로그래밍
데이터와 기능들을 하나의 묶음(객체)으로 만들어서 써먹기

1. 추상화

2. 캡슐화
연관된 것끼리 묶고, 외부에서 접근 못하게 숨기기

3. 다형성
대표격!
음식 밥, 라면, 스파게티     //음료수
자동차 포르쉐, 페라리, 부가티 //8톤트럭
                     ↑오버라이딩

4. 상속  (다형성!)
여러 객체에서 기능의 교집합을 상위클래스로 분리하여
중복되는 코드 재사용하기!


🗝️ JVM?

Java Virtual Machine
메모리 관리, OS와 관계 없이 독립적으로 실행시켜주는 가상 환경


짝수와 홀수

프로그래머스 Lv.1 짝수와 홀수

정수 num이 짝수일 경우 "Even"을 반환하고
홀수인 경우 "Odd"를 반환하는 함수, solution을 완성해주세요.

  • num은 int 범위의 정수입니다.
  • 0은 짝수입니다.

👉 제출한 풀이

class Solution {
    public String solution(int num) {
        if (num % 2 == 0) {
            String answer = "Even";
            return answer;
        } else {
            String answer = "Odd";
            return answer;
        }
    }
}

👉 수정한 풀이

class Solution {
    public String solution(int num) {
        String answer = (num % 2 == 0) ? "Even" : "Odd";
        return answer;
    }
}

📒 NOTE

✏️사전지식이 없어서 JAVA강의를 듣고나서 풀어보려고 했는데
문제가 너무 쉬워서 그냥 제출해버렸다
나중에 수정을 해보려 했지만 불가능하다고…


없는 숫자 더하기

프로그래머스 Lv.1 없는 숫자 더하기

0부터 9까지의 숫자 중 일부가 들어있는 정수 배열 numbers가 매개변수로 주어집니다. numbers에서 찾을 수 없는 0부터 9까지의 숫자를 모두 찾아 더한 수를 return 하도록 solution 함수를 완성해주세요.

  • 1 ≤ numbers의 길이 ≤ 9
    • 0 ≤ numbers의 모든 원소 ≤ 9
    • numbers의 모든 원소는 서로 다릅니다.

👉 제출한 풀이

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

👉 다른 사람의 풀이

class Solution {
    public int solution(int[] numbers) {
        int sum = 45;
        for (int i : numbers) {
            sum -= i;
        }
        return sum;
    }
}

📒 NOTE

✏️좋은거 배웠다!!
for (int i=0; i<numbers.length; ++i) {
     int a = numbers[i]

for (int i : numbers)
     int a = i


행렬의 덧셈

프로그래머스 Lv.1 행렬의 덧셈

행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요.

  • 행렬 arr1, arr2의 행과 열의 길이는 500을 넘지 않습니다.

👉 제출한 풀이

class Solution {
    public int[][] solution(int[][] arr1, int[][] arr2) {
        int[][] answer = new int[arr1.length][arr1[0].length];
        for (int i =0; i< arr1.length; i++) {
            for (int j =0; j< arr1[0].length; j++) {
                int a1 = arr1[i][j] + arr2[i][j];
                answer[i][j] = a1;
            }
        }
        return answer;
    }
}

👉 다른 사람의 풀이

class Solution {
    public int[][] solution(int[][] arr1, int[][] arr2) {
        int[][] answer = {};
        answer = arr1;
        for(int i=0; i<arr1.length; i++){
            for(int j=0; j<arr1[0].length; j++){
                answer[i][j] += arr2[i][j];
            }
        }
        return answer;
    }
}

📒 NOTE

✏️이 생각을 왜 못했을까!
answerarr1로 할당해버리면
arr2를 더하기만 해도 끝나는구나!
심지어 answer 크기 할당도 따로 안 해도 되고!


나누어 떨어지는 숫자 배열

프로그래머스 Lv.1 나누어 떨어지는 숫자 배열

array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요.
divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.

  • arr은 자연수를 담은 배열입니다.
  • 정수 i, j에 대해 i ≠ j 이면 arr[i] ≠ arr[j] 입니다.
  • divisor는 자연수입니다.
  • array는 길이 1 이상인 배열입니다.

👉 제출한 풀이

import java.util.Arrays;

class Solution {
    public int[] solution(int[] arr, int divisor) {
        int count = 0;
        int[] answer;
        for (int i : arr) {
            if (i % divisor == 0) count++;
        }
        if (count == 0) {
            answer = new int[] {-1};
        } else {
            answer = new int[count];
            int cnt = 0;
            for (int i=0; i<arr.length; i++) {
                if (arr[i] % divisor == 0) {
                    answer[cnt] = arr[i];
                    cnt++;
                }
            }
        }
        Arrays.sort(answer);
        return answer;
    }
}

👉 다른 사람의 풀이

// 문제가 개편되었습니다. 이로 인해 함수 구성이나 테스트케이스가 변경되어, 
//과거의 코드는 동작하지 않을 수 있습니다.
// 새로운 함수 구성을 적용하려면 [코드 초기화] 버튼을 누르세요. 
//단, [코드 초기화] 버튼을 누르면 작성 중인 코드는 사라집니다.
import java.util.Arrays;

class Divisible {
    public int[] divisible(int[] array, int divisor) {
        //ret에 array에 포함된 정수중, divisor로 나누어 떨어지는 숫자를 순서대로 넣으세요.
        return Arrays.stream(array).filter(factor -> factor % divisor == 0).toArray();
    }
    // 아래는 테스트로 출력해 보기 위한 코드입니다.
    public static void main(String[] args) {
        Divisible div = new Divisible();
        int[] array = {5, 9, 7, 10};
        System.out.println( Arrays.toString( div.divisible(array, 5) ));
    }
}

import java.util.*;

class Solution {
    public int[] solution(int[] arr, int divisor) {
        ArrayList<Integer> arrList = new ArrayList<Integer>();

        for (int i : arr) {
            if (i % divisor == 0) {
                arrList.add(i);
            }
        }
        int[] answer = new int[arrList.size()];
        Collections.sort(arrList);
        for (int i = 0; i < arrList.size(); i++) {
            answer[i] = arrList.get(i).intValue();
        }
        int[] error = {-1};
        return (answer.length != 0) ? answer : error;
    }

📒 NOTE

✏️시간이 조금 걸렸다.
내가 처음에 생각한 방법은 동적 배열을 선언한 후,

for(int : arr) {
	if (i % divisor == 0) {

로 들어오는 요소를 추가시키는 거였는데
return하는 배열이 int가 아닌 Integer라서
Integer => int로 변환을 계속 시도했지만
그럴 때마다 오류 메세지가 떠버렸다.
💡 int는 자료형, Integer는 객체라고 한다.

✏️2주차 팀원 중 한분이 ArrayList를 사용해서 풀어주셨다.
Integer 배열의 크기int 배열을 선언하고
요소를 하나씩 넣어주는…!

✏️다른 사람들이 푼 코드들을 보니 람다를 썼다고 하고
찾아봤을때도 Stream람다를 언급하는 글이 많았는데
한번 알아봐야겠다.
이 문제의 의도가 그 부분을 알고있느냐 아닐까?


서울에서 김서방 찾기

프로그래머스 Lv.1 서울에서 김서방 찾기

String형 배열 seoul의 element중 "Kim"의 위치 x를 찾아, "김서방은 x에 있다"는 String을 반환하는 함수, solution을 완성하세요. seoul에 "Kim"은 오직 한 번만 나타나며 잘못된 값이 입력되는 경우는 없습니다.

  • seoul은 길이 1 이상, 1000 이하인 배열입니다.
  • seoul의 원소는 길이 1 이상, 20 이하인 문자열입니다.
  • "Kim"은 반드시 seoul 안에 포함되어 있습니다.

👉 제출한 풀이

class Solution {
    public String solution(String[] seoul) {
        String location = null;
        for (int i = 0; i < seoul.length; i++) {
            if (seoul[i].equals("Kim")) {
                location = Integer.toString(i);
            }
        }
        String answer = String.format("김서방은 %s에 있다", location);
        return answer;
    }
}

class Solution {
    public String solution(String[] seoul) {
        int a = 0;
        for (int i = 0; i < seoul.length; i++) {
            if (seoul[i].equals("Kim")) {
                a = i;
            }
        }
        return "김서방은 "+a+"에 있다";
    }
}

👉 다른 사람의 풀이

// 문제가 개편되었습니다. 이로 인해 함수 구성이나 테스트케이스가 변경되어, 
//과거의 코드는 동작하지 않을 수 있습니다.
// 새로운 함수 구성을 적용하려면 [코드 초기화] 버튼을 누르세요. 
//단, [코드 초기화] 버튼을 누르면 작성 중인 코드는 사라집니다.
import java.util.Arrays;

public class FindKim {
    public String findKim(String[] seoul){
        //x에 김서방의 위치를 저장하세요.
        int x = Arrays.asList(seoul).indexOf("Kim");

        return "김서방은 "+ x + "에 있다";
    }

    // 실행을 위한 테스트코드입니다.
    public static void main(String[] args) {
        FindKim kim = new FindKim();
        String[] names = {"Queen", "Tod","Kim"};
        System.out.println(kim.findKim(names));
    }
}

📒 NOTE

✏️원래는 2번째 풀이로 하려고 했으나
개인적인 사정으로 시급한 상황이었어서
에러 메세지를 제대로 읽지도 않고 속단해서
1번째 풀이로 제출했다.

class Solution {
    public String solution(String[] seoul) {
        int i;
        for (i = 0; i < seoul.length; i++) {
            if (seoul[i].equals("Kim")) {
                int a = i;
            }
        }
        return "김서방은 "+a+"에 있다";
    }
}
여기서 a는 지역변수…
그 전에 a를 선언했어야 했다

두개를 비교해보니 속도면에서는 1번째가 낫긴 하다

✏️indexOf()라는 메소드를 이용하면
간단하게 적을 수 있다!
여전히 속도는 제출한 풀이가 빠르다…
속도 차이의 이유도 나중에 공부…하겠지?


이상한 문자 만들기

프로그래머스 Lv.1 이상한 문자 만들기

문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.

  • 문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다.
  • 첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.

👉 제출한 풀이

class Solution {
    public String solution(String s) {
        char[] arr = s.toCharArray();

        int index = 0;
        for (int i = 0; i< arr.length; i++) {
            if (arr[i] != ' ') {
                char a = (index % 2 == 0) ?
                	Character.toUpperCase(arr[i]) : Character.toLowerCase(arr[i]);
                arr[i] = a;
                index++;
            } else {
                index = 0;
            }
        }
        return new String(arr);
    }
}

👉 다른 사람의 풀이

class Solution {
  public String solution(String s) {

        String answer = "";
        int cnt = 0;
        String[] array = s.split("");

        for(String ss : array) {
            cnt = ss.contains(" ") ? 0 : cnt + 1;
            answer += cnt%2 == 0 ? ss.toLowerCase() : ss.toUpperCase(); 
        }
      return answer;
  }
}

📒 NOTE

✏️다른 팀원 문제인데 계속 오류가 나서 나도 같이 풀어봤다


자릿수 더하기

프로그래머스 Lv.1 자릿수 더하기

자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요.
예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다.

  • N의 범위 : 100,000,000 이하의 자연수

👉 제출한 풀이

class Solution {
    public int solution(int n) {
        String digit = Integer.toString(n);
        int divisor = (int) Math.pow(10, digit.length()-1);
        int answer = 0;
        for (int i =0; i<digit.length(); i++) {
            int m = n/divisor;
            answer += m;

            n -= m*divisor;
            divisor /= 10;
        }
        return answer;
    }
}

👉 수정한 풀이

class Solution {
    public int solution(int n) {
        int answer = 0;
        while (n>0) {
            answer += n % 10;
            n /= 10;
        }
        return answer;
    }
}

📒 NOTE

✏️너무 바보같이 풀었다!!!!!!!!!!!!!
나머지를 이용했으면 얼마나 편했겠니
다시…수정하고 오겠다. 알비백

✏️다른 사람의 풀이도 내가 수정한 풀이처럼 풀었다.
그렇다. 나만 바보였다


제일 작은 수 제거하기

프로그래머스 Lv.1 제일 작은 수 제거하기

정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다.

  • arr은 길이 1 이상인 배열입니다.
  • 인덱스 i, j에 대해 i ≠ j이면 arr[i] ≠ arr[j] 입니다.

👉 제출한 풀이

class Solution {
    public int[] solution(int[] arr) {
        int[] answer = new int[arr.length - 1];
        if (arr.length == 1) {
            answer = new int[] {-1};
        } else {
            int min = arr[0];
            for (int i : arr) {
                if (i < min) {
                    min = i;
                }
            }
            int index = 0;
            for (int i : arr) {
                if (i > min) {
                    answer[index] = i;
                    index++;
                }
            }
        }
        return answer;
    }
}

👉 다른 사람의 풀이

class Solution {
  public int[] solution(int[] arr) {
      if (arr.length <= 1) return new int[]{ -1 };
      int min = Arrays.stream(arr).min().getAsInt();
      return Arrays.stream(arr).filter(i -> i != min).toArray();
  }
}

📒 NOTE

✏️다른 사람의 풀이는 짧긴 하지만 속도가 느리다

profile
공부합니다📚

0개의 댓글