20210119-TIL

나영원·2021년 1월 20일
0

T.I.L.

목록 보기
115/145

공부할 내용

  • 알고리즘 문제 풀이
  • 스프링 수업복습
  • 자료구조/알고리즘 수업
  • TiL 정리 및 Git & 블로그 업데이트

오늘 공부한 것 & 배운 내용

알고리즘 문제 풀이

약수의합

  • 풀이

    class Solution {
        public int solution(int n) {
    
            int answer = 0;
    
            for (int i = 1; i <= n ; i++) {
                if (n % i == 0) {
                    answer += i;
                }
            }
            
            return answer;
        }
    }
    • 다른 문제풀이를 보니 약수의 성질을 이용해 for문을 n이아닌 n/2 만크만돌려도 작동을 하는 것을 볼 수 있었다

이상한문자만들기

  • 풀이

    class Solution {
        public String solution(String s) {
            String lowerCase = s.toLowerCase();
            String upperCase = s.toUpperCase();
            StringBuilder stringBuilder = new StringBuilder();
    
            int count = 0;
            for (int i = 0; i < s.length(); i++) {
                if(count%2 ==0) {
                   stringBuilder.append(upperCase.charAt(i));
                } else {
                    stringBuilder.append(lowerCase.charAt(i));
                }
                if (s.charAt(i)== ' ') {
                    count =0;
                } else {
                    count ++;
                }
            }
            return stringBuilder.toString();
        }
    }
    • lowerCase와 upperCase로 만들어서 count에 따라 번갈아가면서 넣을수 있도록 해서 문제를 해결했다
      • 공백이 여러개가 있을 경우 i로 하면 count를 0으로 초기화시켜주어 첫글자가 대문자가 올수있게하였다
    • 다른사람 풀이
      • String을 toCharArray 처럼 String[]으로 만들기 위해서는 s.spli("")를 쓰면 된다
      • count를 올리는 조건문같이 간단한 것은 3항연산자로 표기하면 좋다

자릿수더하기

  • 풀이

    public class Solution {
        public int solution(int n) {
            Integer integer = n;
            String str = String.valueOf(n);
            int answer = 0;
            for (int i = 0; i < str.length(); i++) {
                answer += Integer.parseInt(String.valueOf(str.charAt(i)));
            }
            return answer;
        }
    }
    • int를 String으로 변환해서 하나씩 다시 int로 변환시켜 더하는 방식으로 풀었다
  • 다른 사람풀이

    • String으로 변환하지 않고 n%10한것을 더해주는 방식으로 풀었고 이게더 적절한 방법인 것 같다

자연수 뒤집어 배열로 만들기

  • 풀이

    class Solution {
        public int[] solution(long n) {
            String str = String.valueOf(n);
            int[] answer = new int[str.length()];
    
            long divisor =10;
            for (int i = 0; i <str.length() ; i++) {
                answer[i] = (int)(n % divisor);
                n = n / divisor;
            }
            return answer;
        }
    }
    • int[]을 만들기 위해 길이가 필요해서 n을 String으로 만들어 length를 구했다
    • 이후 divisor로 나눈 나머지 값을 int[]에 넣어주고 n의 자릿수를 줄여가는 방식으로 풀어나갔다
  • 다른사람 풀이

    • String으로 바꾸었으니 StringBuilder.rever로 뒤집어서 그대로 넣은 사람도 있었다
      • 바꾼김에 그냥 이렇게 넣는것도 일관성있는 풀이인 것 같다

정수 내림차순으로 배치하기

  • 풀이

    • import java.util.Arrays;
      
      class Solution {
          public long solution(long n) {
              char[] chars = String.valueOf(n).toCharArray();
              Arrays.sort(chars);
              StringBuilder stringBuilder = new StringBuilder(String.valueOf(chars));
              return  Long.parseLong(stringBuilder.reverse().toString());
          }
      }
    • long을 chars로 만들고 Arays.sort를 역순으로 돌리고 싶었는데 그러면 Characters[]가 되야되서 StringBuilder로 reverse하는 방식을 선택하였다

  • 다른사람 풀이

    • class Solution {
          public long solution(long n) {
              return Long.parseLong(String.valueOf(n).chars().mapToObj(ch -> (char) ch)
                      .sorted(Comparator.reverseOrder())
                      .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
                      .toString());
          }
      }
    • char()를 통해 Stream으로 만들어 한번에 처리가 가능했다

      • 스트림을 통해 StringBuilder까지 사용하는건 처음봐서 신기하다

정수제곱근판별

  • 풀이

    • class Solution {
          public long solution(long n) {
              long answer = -1;
              int i = 1;
              while (n/i >= i) {
               if(n % i ==0 && n/i == i){
                   answer = i;
               }
               i++;
              }
      
              return answer == -1 ? -1 : (long)Math.pow(answer+1,2);
          }
      }
    • while문을 통해 n/i가 i보다 크거나 같을대까지만 범위를 정해서 n/i ==i일때 i를 답이 되도록 하였다

    • 제곱을 깔끔하게 하기위해 Math.pow함수를 사용해보았다

  • 다른사람풀이

    • class Solution {
        public long solution(long n) {
            if (Math.pow((int)Math.sqrt(n), 2) == n) {
                  return (long) Math.pow(Math.sqrt(n) + 1, 2);
              }
      
              return -1;
        }
      }
    • Math.pow를 활용할거면 제곱근인 Math.sqrt함수도 활용해보았어야됫는데 생각을 못했다

    • sqrt의 값은 double로 나오기 때문에 다시 pow를 한경우 소숫점자리에서 달라질수 있다는걸 이해해야 이렇게 풀수있는것 같다

제일작은수제거하기

  • 풀이

    • import java.util.ArrayList;
      import java.util.List;
      
      class Solution {
          public int[] solution(int[] arr) {
      
              if (arr.length == 1) {
                  return new int[]{-1};
              }
      
              int minVal = Integer.MAX_VALUE;
              int index = 0;
      
              for (int i = 0; i < arr.length ; i++) {
                  if(arr[i] < minVal) {
                      minVal = arr[i];
                      index = i;
                  }
              }
              List<Integer> list = new ArrayList<>();
              for (int i = 0; i < arr.length ; i++) {
                  if (i == index) {
                      continue;
                  }
                  list.add(arr[i]);
              }
      
              return list.stream().mapToInt(i -> i).toArray();
          }
      }
      • arr.length가 -1 이면 -1이담긴 배열을 return한다
      • 첫번째 for문으로 minVal에 index를 알아낸다
      • 두번째 for문으로 index를 제외한 모든값을 list에 넣는다
      • list를 array로 바꿔서 return한다
  • 다른 사람 풀이

    • arr.length가 -1이면 새로운 배열을 만들지 않고 arr[0]을 -1을 대입해서 return하면 된다
    • arr을 list로 바꾼뒤 Colletions.min(list)를 통해 minval을 찾고 arrayList.remove(minVal0)을 해줄수도 있다

내일 공부할 내용

  • 알고리즘 문제 풀이
  • 모의면접준비
  • 자료구조/알고리즘 복습
  • TiL 정리 및 Git & 블로그 업데이트
profile
배우는 개발 일기

0개의 댓글