코딩테스트-알고리즘/도전

2023.12.23 - 9문제

닉네임생각즁 2023. 12. 23. 23:23

 

등차수열의 특정한 항만 더하기

https://school.programmers.co.kr/learn/courses/30/lessons/181931

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

class Solution {
    public int solution(int a, int d, boolean[] included) {
        int answer = 0;
        
        for(int i=0; i<included.length; i++){
            if(included[i] == true) {
                answer += a+d*i;
            }
        
        }
        return answer;
    }
}

등차수열-> a+d*0, a+d*1, a+d*2, ....

 

 

주사위 게임 2

https://school.programmers.co.kr/learn/courses/30/lessons/181930

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

class Solution {
    public int solution(int a, int b, int c) {
        int answer = 0;
        
        if(a!=b && a!=c && b!=c) {
            answer = a + b + c;            
        } else if(a==b && b!=c) {
            answer = (a + b + c) * (a*a + b*b + c*c);
        } else if(a==c && a!=b) {
            answer = (a + b + c) * (a*a + b*b + c*c);
        } else if(b==c && a!=b) {
            answer = (a + b + c) * (a*a + b*b + c*c);
        } else if(a==b && b==c) {
            answer = (a + b + c) * (a*a + b*b + c*c ) * (a*a*a + b*b*b + c*c*c);
        }
        
        return answer;
    }
}

 

중간을 그냥

else if (a == b || a == c || b == c) {

이렇게 해버리면 됐었구나..!

 

 

원소들의 곱과 합

https://school.programmers.co.kr/learn/courses/30/lessons/181929

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

class Solution {
    public int solution(int[] num_list) {
        
        int a = 1; //모든 원소들의 곱
        int b = 0; //모든 원소들의 합의 제곱
        
        for(int num : num_list) {
            a *= num;
            b += num;
        }
        b = b*b;
        
        int answer = a < b ? 1 : 0;
        return answer;
    }
}

 

 

이어 붙인 수

https://school.programmers.co.kr/learn/courses/30/lessons/181928

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

class Solution {
    public int solution(int[] num_list) {
        int answer = 0;
        String odd = ""; //홀수만
        String even = ""; //짝수만
        
        for(int num : num_list) {
            if (num % 2 == 1) {
                odd += (char)(num+'0');
            } else {
                even += (char)(num+'0');
            }
        } 
        
        answer = Integer.parseInt(odd) + Integer.parseInt(even);
        
        return answer;
    }
}
 num + "";

이렇게 해서 문자열로 만들어줘서 더해줘도 되는거였다

 

 

마지막 두 원소

https://school.programmers.co.kr/learn/courses/30/lessons/181927

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

class Solution {
    public int[] solution(int[] num_list) {
        int n = num_list.length;
        int[] answer = new int[n+1];
        
        int result = 0; // 새로 들어갈 마지막 원소
        result = num_list[n-1]>num_list[n-2] ? num_list[n-1]-num_list[n-2] : num_list[n-1] * 2;
        
        for(int i = 0; i<n+1; i++){
            if(i!=n) {
                answer[i] = num_list[i]; 
            } else {
                answer[i] = result;
            }
        }

        return answer;
    }
}

 

 

수 조작하기 1

https://school.programmers.co.kr/learn/courses/30/lessons/181926

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

class Solution {
    public int solution(int n, String control) {
        
        for(int i=0; i<control.length(); i++){
            if(control.charAt(i) == 'w') {
                n += 1;
            } else if(control.charAt(i) == 's') {
                n -= 1;
            } else if(control.charAt(i) == 'd') {
                n += 10;
            } else if(control.charAt(i) == 'a') {
                n -= 10;
            }
        }
        
        
        return n;
    }
}

 

다른 사람 풀이

class Solution {
    public int solution(int n, String control) {
        int answer = n;

        for(char ch : control.toCharArray()) {
            switch(ch) {
                case 'w': answer += 1; break;
                case 's': answer -= 1; break;
                case 'd': answer += 10; break;
                case 'a': answer -= 10; break;
                default:break;
            }
        }

        return answer;
    }
}

char배열에 넣고 돌리는 방법도 있었다 그리고 switch-case문을 쓰니 코드가 더 깔끔해보인다

 

 

수 조작하기 2

https://school.programmers.co.kr/learn/courses/30/lessons/181925

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

class Solution {
    public String solution(int[] numLog) {
        String answer = "";
        int n = numLog[0];
        
        for(int i=1; i<numLog.length; i++) {
            if(numLog[i] == n+1) {
                answer += "w";
                n = numLog[i];
            } else if(numLog[i] == n-1) {
                answer += "s";
                n = numLog[i];
            } else if(numLog[i] == n+10) {
                answer += "d";
                n = numLog[i];
            } else if(numLog[i] == n-10) {
                answer += "a";
                n = numLog[i];
            } 
        }
        
        return answer;
    }
}

 

 

수열과 구간 쿼리 3

https://school.programmers.co.kr/learn/courses/30/lessons/181924

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

import java.util.*;

class Solution {
    public int[] solution(int[] arr, int[][] queries) {
        int[] answer = Arrays.copyOf(arr, arr.length);
        
        for(int i=0; i<queries.length;i++){
            int a = queries[i][0];
            int b = queries[i][1];
            
            int a_copy = answer[a];
            int b_copy = answer[b];
            
            answer[a] = b_copy;
            answer[b] = a_copy;
        }
        
        return answer;
    }
}

 

 

 

 

가장 먼저 풀고 가장 먼저 작성했던 부분이다 이때 많이 헤매고 여러가지를 찾아봐서 그런지 개념이 좀 잡혀서 위에 푼 문제들은 후루룩 풀 수 있었다 👍

 

코드 처리하기

https://school.programmers.co.kr/learn/courses/30/lessons/181932

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

틀린 코드

//import java.util.*;

class Solution {
    public String solution(String code) {
        //ArrayList<String> ret = new ArrayList<>();
        String answer = "";
        int mode = 0;
        
        for(int i=0; i<code.length(); i++){
            if(mode==0){
                if (code.charAt(i) == '1') { //code.charAt(i) == "1"
                    mode++;
                }
                else if (i%2==0){
                    //ret.add(code.charAt(i));
                    answer += code.charAt(i);
                } else {
                    continue;
                }
            }
            
            else {
                if (code.charAt(i) == '1') {
                    mode--;
                }
                else if (i%2==1){
                    answer += code.charAt(i);
                } else {
                    continue;
                }   
            }
            
        }
        
        
        // if (ret.size() == 0) {
        //     return "ENPTY";
        // } else {
        //     String answer = String.join("", ret);
        //     return answer; 
        // }
        
        answer = answer.length() == 0 ? "ENPTY" : answer;
        
        return answer;
    
    }
}

 

주석으로 남겨놓은건 헤맸던 기록이자 이제 절대 안 까먹을거같은 바보같은 실수들,,

 

1

if (code.charAt(i) == "1")

 

 

String - " "

char - ' '

 

각각 다르다

검색하다보니 나랑 같은 과정을 겪은 사람이 있었다

 

https://velog.io/@sungmo738/JAVA-char%ED%98%95-%EB%B9%84%EA%B5%90

 

JAVA char형 비교

문제풀다가 문자열하나하나씩 비교할일이 생겼는데str.charAt(i) == "1"charAt은 char이고"1" 이건 string 이라서 비교가 안된다.그래서 하나를 형변환을 해서 비교를 하고 개 뻘짓을 했는데str.charAt(i) == '1

velog.io

나랑 정말 똑같다 1을 비교하고있는거보니 같은 문제일까??

암튼 나도 equlas()도 써보고 string으로도 바꿔서도 해보고 참 다양하게 돌고돌았다

자바는 너무 깐깐한거같음 그냥 ''이거든 ""이거든 그냥 문자 비교해주면 안되는걸까😢😢😢,,,,, 당연히 안되겠지 이제 절대 안까먹을거같다

 

 

2

ArrayList<String> ret = new ArrayList<>();
.
.
ret.add(code.charAt(i));
.
.
if (ret.size() == 0) {
	return "ENPTY";
	} else {
	String answer = String.join("", ret);
	return answer; 
	}

 

ArrayList에는 char를 넣을 수 없나 하면서 string으로 바꾸고 여러가지 또 고쳐보면서 엄청난 뻘짓을 했다,, 그러다가 갑자기 깨달았다 그냥 answer 문자열에 +char값 해주면 되는거잖아? 라는것을..............................🤦‍♀️🤦‍♀️🤦‍♀️🤦‍♀️🤦‍♀️🤦‍♀️🤦‍♀️🤦‍♀️

 

처음 생각은

계속 값을 추가해줘야하는데 자바에서 배열은 추가가 자유롭지 않으니까 추가가 되는걸 써야겠다->그럼 뭐로 해야하지?->배열과 리스트 차이 공부->그럼 추가가 자유로운 리스트를 써야겠다

이랬다

 

그렇게 엄청난 뻘짓이 시작됐고......................... 정말 크게 돌고돌아돌아돌아 많은 시간을 날리고 깨달았다

리스트를 만들 필요도 없었고 그냥 문자열에 +해서 char값을 추가만 해주면 되는 간단한 문제였다ㅠㅠㅠㅠ

그치만 이 한문제로 배운건 많으니까 뿌듯하다................라고 긍정적으로 생각해보기로 했다🙃🙃 근데 날린 시간이 너무 길어서 마음이 아프다

아직 제대로 몰라서 더 복잡하게 생각하는 느낌,,

자바랑 이별하고 싶다

 

암튼 많은 삽질끝에 정답 가까이 다가갔다

 

어딘가 걸러내지 못하는게 있나보다 다시 차근차근 생각하기 시작,,

이 문제에서 빨리 벗어나고싶다 

.

.

.

 

최종코드

class Solution {
    public String solution(String code) {
        String answer = "";
        int mode = 0;
        
        for(int i=0; i<code.length(); i++){
            if(mode==0){
                if (code.charAt(i) == '1') {
                    mode++;
                }
                else if (i%2==0){
                    answer += code.charAt(i);
                } else {
                    continue;
                }
            }
            
            else {
                if (code.charAt(i) == '1') {
                    mode--;
                }
                else if (i%2==1){
                    answer += code.charAt(i);
                } else {
                    continue;
                }   
            }
            
        }
        
        

        
        answer = answer.length() == 0 ? "EMPTY" : answer;
        
        return answer;
    
    }
}

 

코드 다시 보고 천천히 적으면서 또해보고 반복했는데도 틀린 부분이 없어보였다 예외생각해도 더이상 없고,, 그래서 결국 chapGPT한테 물어봤고 내 실수를 알아낼 수 있었다

 

🤦‍♂️🤦‍♀️🤦‍♂️🤦‍♀️🤦‍♂️🤦‍♀️🤦‍♂️🤦‍♀️🤦‍♂️🤦‍♀️🤦‍♂️🤦‍♀️🤦‍♂️🤦‍♀️🤦‍♂️🤦‍♀️🤦‍♂️🤦‍♀️🤦‍♂️🤦‍♀️🤦‍♂️🤦‍♀️🤦‍♂️🤦‍♀️🤦‍♂️🤦‍♀️🤦‍♂️🤦‍♀️

 

진짜 열받는다ㅠㅠㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

뭔 엠비티아이도 아니고 ENP뭔데,, 정말정말 어이없는 실수였다

이거 붙잡고 밤샐뻔했는데 챗지피티가 살려줬다

 

드디어 끝

오늘의 교훈 : 쓸데없이 어렵게 생각하지 말자🤦‍♀️ 

 

 

 

 

'코딩테스트-알고리즘 > 도전' 카테고리의 다른 글

2023.12.25 - 6문제  (0) 2023.12.25
2023.12.24 - 4문제  (0) 2023.12.24
2023.12.21 - 10문제  (0) 2023.12.21
2023.12.20 - 12문제  (1) 2023.12.20
12월 31일까지 도전  (0) 2023.12.20