ssung_항해일지/항해99_프로그래밍 기초(알고리즘)

알고리즘 - 2일차 (23.01.28)

ssungcohol 2023. 1. 30. 01:53

없는 숫자 더하기

 - numbers에서 찾을 수 없는 0~9까지의 숫자를 모두 찾아 더한 수를 return

numbers result
[1, 2, 3, 4, 6, 7, 8, 0] 14
[5, 8, 4, 0, 6, 7, 9] 6

나의 풀이 및 부족한 점

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

사실 처음에는 이 방법을 생각치 못하다 구글링을 하고 팀원들과 페어를 하게되면서 공유하게 된 코드!

기존의 내가 구현하고 싶었던 코드를 스스로 구현해보고, 추후에 보강을 해보자..

(문제를 단순하게 바꿔 읽는, 다양하게 생각을 할 수 있어야 할 것 같다... 물론 거기에 코드를 적용할 수 있는 능력은 필수!)


음양 더하기

 - signs가 true면 양수, false면 음수를 의미하며, 정수들의 합을 구하여 return

absolutes signs result
[4, 7, 12] [true, false, true] 9
[1, 2, 3] [false, false, true] 0

나의 풀이 및 부족한 점

class Solution {
    public int solution(int[] absolutes, boolean[] signs) {
        int answer = 0;
        
for (int i = 0; i < signs.length; i++){
            if (signs[i]){
                answer += absolutes[i];
            } else {
                answer -= absolutes[i];
            }
        }
                return answer;
    }
}

주어진 정수를 if 문을 통해서 어떻게 양수, 음수를 한참을 고민했다..

signs에 주어진 조건은 true, false.

단순하게 생각하면 조건1 == true 즉, if (signs[i]) 를 적용하고 else를 통해 조건을 나누고 풀 수 있었던 문제!


 

핸드폰 번호 가리기

 - 주어진 번호의 뒷 4자리를 제외한 모든 번호는 " * "로 표시

phone_number return
"01033334444" "*******4444"
"027778888" "*****8888"

나의 풀이 및 부족한 점

class Solution {
    public String solution(String phone_number) {
        String answer = "";
        
        for (int i = 0; i < phone_number.length(); i++) {
            if (i < phone_number.length() - 4) {
                answer += "*";
            } else {
                answer += phone_number.charAt(i);
            }
            
        }
                return answer;
    }
}

반복문(for)을 사용해 뒷 4자리 전까지는 " * " 문자를 추가해 주고, 뒷 4자리는 charAt() 을 사용하여 표시!

 

다른 풀이

class Solution {
	public String solution(String phone_number) {
        String answer = "";
         String b = "*";
         String a = "";
        
         for (int i = phone_number.length() - 4 ; i <phone_number.length(); i++){
             a += phone_number.charAt(i);
         }
         answer = b.repeat(phone_number.length()-4) + a;
                 return answer;
    }
}

인상 깊었던 풀이 방법! 

뒷 4자리와 앞자리를 구분하여 구해준 뒤 문자열을 합쳐주는 방식!


2016년(처음부터 다시 풀어보기) : 내 기준에는 미친 문제였다..

 - 2016년의 a월 b일은 무슨 요일??

a b reuslt
5 24 "TUE"

조건 - 2016년은 윤년이고, 2016년 a월 b일은 실제한다!

 

나의 풀이

class Solution {
    public String solution(int a, int b) {
        String answer = "";
        
        String[] day = { "FRI", "SAT", "SUN", "MON", "TUE", "WED", "THU" }; // 요일 - 나머지로 정리
        int[] month = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // 월 - a-1
        
        int date = 0; // 날짜 - month i 번째 더하기
        
        for (int i = 0; i < a-1; i++) {
            date += month[i];  // 1월부터 날짜 수 더하기
        }
        
        date += b-1;
        return day[date % 7];
    }
}

3시간에 걸려 생각하고 안되서 찾아보고 풀어보고 했던 문제..

나중에 저 풀이를 다 지우고 다시 풀어볼 예정..

분명히 다시 풀라고하면 못풀것 같다...


알고리즘 주차 2일차에 느낀점

 

Java 문법에 아직 익숙치 않고, 머리속에 들어와있지도 않은 상태라고 생각이 든다..

거기에 코드를 떠올리고 문제에 적용시키려고하니 머리는 움직이는데, 컴퓨터적(?) 사고에는 적응이 아직 덜 된 상태

코드를 칠 때 단순하게 생각하고, 이론은 이런게 있구나 하면서 계속 반복적으로 읽어보고 따라쳐보는 것이 답이 것 같다.

 

충분히 할 수 이따 ssungjaeee~~~ 항해 본격 시작전 웹종반 2회독도 아닌 4회독 혼자서 하면서 다 따라쳐보고 했잖아?!

지금은 그 때보다 물리적인 시간이 부족하고, 할 것도 많은게 사실이지만!
나만의 속도에 맞춰 천천히 나아가겠다는 다짐을 생각하며 뒤쳐져도 꾸준히 나아가자~ 포기하지 말자~

지금 어려우면 나중에도 어렵고, 지금 오늘의 내가 남은 조성재 중에서 가장 젊은 조성재다!

728x90