20210115-TIL

나영원·2021년 1월 17일
0

T.I.L.

목록 보기
112/145

공부할 내용

  • 알고리즘 복습 및 과제
  • 운영체제 복습 및 과제
  • TiL 정리 및 Git & 블로그 업데이트

오늘 공부한 것 & 배운 내용

알고리즘 복습 및 과제

  • 더블링크드리스트구현

    • 싱글은 간단히 구현했는데 더블은 생각보다 어려워서 한참 걸려서 했는데 에러가 많아서 solution을 보면서 다시구현했는데 내가 구현해놓은것에 구멍이 많았다
    • 링크드리스트 구조를 익히기에 좋은 예제 였던 것 같다.
  • NodeBinaryTree구현

    • 수업에서 배열을 이용한 BinaryTree구현 예제를 알려주셔서 재귀함수를 이용하는 것을 알아서 대부분 쉽게 구현할 수 있었다
      • bfs를 통한 탐색이 어려웠는데 기존것과는 다르게 재귀함수로 풀수가 없었기 때문이다
      • 동료의 힌트로 queue를 활용하는 것을 알았고 queue에 순서대로 넣은것을 빼가면서 탐색하는 방식으로 문제를 해결할 수 있었다

알고리즘 문제 풀이

가운데글자가져오기

  • 풀이
class Solution {
    public String solution(String s) {

        char[] chars = s.toCharArray();
        StringBuilder stringBuilder = new StringBuilder();


        if (chars.length % 2 == 0 ) {
            int half = chars.length/2;
            stringBuilder.append(chars[half-1]);
            stringBuilder.append(chars[half]);
        } else {
            int half = chars.length/2+1;
            stringBuilder.append(chars[half-1]);
        }


        return stringBuilder.toString();
    }
}
  • String에 길이가 짝수인지 홀수인지 구해서 출력해주는 간단한 문제였다

    return word.substring((word.length()-1) / 2, word.length()/2 + 1);   
    • 다른사람의 풀이를 보니 한줄로도 해결되는 것 같다..
      • subString의 2번째 param은 -1이라는 것을 이용한 풀이었다.

같은숫자는싫어

  • 풀이

    import java.util.*;
    
    public class Solution {
        public int[] solution(int []arr) {
            int[] answer = {};
            int temp = -1;
            List<Integer> list = new ArrayList<>();
    
            for (int i = 0; i < arr.length; i++) {
                if (arr[i] != temp) {
                   list.add(arr[i]);
                }
                temp = arr[i];
            }
    
            return list.stream().mapToInt(i -> i).toArray();
        }
    }
    • Integer list를 int[]로 변환할대 stream을 이용해서 하는 것을 연습할수 있었다
      • Integer[]를 int[]로 바꾸는 것보단 더 간단하게 할 수 있는 것 같다

나누어떨어지는숫자배열

  • 풀이

    import java.util.ArrayList;
    import java.util.List;
    
    class Solution {
        public int[] solution(int[] arr, int divisor) {
            List<Integer> list = new ArrayList<>();
    
            for (int i = 0; i <arr.length ; i++) {
                if(arr[i] % divisor == 0) {
                    list.add(arr[i]);
                }
            }
            if (list.isEmpty()) {
                list.add(-1);
            }
    
            return list.stream().mapToInt(i ->i).sorted().toArray();
        }
    }
    • 위의 문제와 크게 다르지않게 분류해서 list에 넣어서 정렬해서 int[]로 변환해서 풀수 있었다

두정수사이의합

  • 풀이

    class Solution {
        public long solution(int a, int b) {
            long bigNum ;
            long smallNum;
            long answer = 0;
            if(a==b) {
                return a;
            } else if(a > b) {
                bigNum = a;
                smallNum = b;
            } else {
                bigNum = b;
                smallNum = a;
            }
    
            for (long i = smallNum; i <= bigNum ; i++) {
                    answer += i;
            }
    
            return answer;
        }
    }
    • 큰 값을 구해서 for문을 통해 합을 해나가는 방식으로 풀었다

    • 다른풀이를 보니 큰값을 구하는데 삼항연산자를 통해 간단히 구하는게 편해보였다

      • 가장 효율적인 답안은 등차수열에 합을 통해서 구하는 것 같았다

           public long solution(int a, int b) {
                return sumAtoB(Math.min(a, b), Math.max(b, a));
            }
        
            private long sumAtoB(long a, long b) {
                return (b - a + 1) * (a + b) / 2;

내일 공부할 내용

  • 운영체제 복습 및 과제
  • 알고리즘 문제풀이
  • TiL 정리 및 Git & 블로그 업데이트
profile
배우는 개발 일기

0개의 댓글