본문 바로가기
Java/알고리즘

Lv1로 쉬어가기 (5문제)

by 티코딩 2023. 10. 25.

lv2가 점점 어려워지고 있다. 기본기를 다지기 위해 Lv1을 5개만 풀어야겠다.

 

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

ㅇ 내가푼 코드

public static int solution(int n) {
        int answer = 0;
        //n을 String 으로 바꾸고
        String numStr = Integer.toString(n);
        //각자리수를 int로 바꿔서 answer에다가 다 때려박음
        for(int i = 0; i < numStr.length(); i++){
            answer += Character.getNumericValue(numStr.charAt(i));
        }

        return answer;
    }

ㅇ 다른분들의 코드

public class Solution {
    public int solution(int n) {
        int answer = 0;

        while(true){
            answer+=n%10;
            if(n<10)
                break;

            n=n/10;
        }

        // [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
        System.out.println("Hello Java");

        return answer;
    }
}

 

2. 자연수 n이 매개변수로 주어집니다. n x로 나눈 나머지가 1이 되도록 하는 가장 작은 자연수 x를 return 하도록 solution 함수를 완성해주세요. 답이 항상 존재함은 증명될 수 있습니다.

ㅇ 내가푼 코드

public int solution(int n) {
        int answer = 0;
        //n을 i로 나눈 나머지가 1이되도록하는 가장작은 x
        //i를 2부터 n-1까지 반복
        for(int i = 2; i < n; i++){
            //나머지가 1되면 break 해준다(최소값)
            if(n%i == 1){
                answer = i;
                break;
            }
        }
        return answer;
    }

ㅇ 다른분들의 코드

public int solution(int n) {
        int answer = 1;

        while(true) {
            if (n%answer==1) break;
            answer++;
        }

        return answer;
    }

비슷한거같다.

 

3. 정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요.

ㅇ 내가푼 코드

public int solution(int n) {
        int answer = 0;

        for(int i = 1; i <= n; i++){
            if(n%i == 0){
                answer += i;
            }
        }
        return answer;
    }

이건 2번문제푼거에 조금만 바꾸면 된다. 약수라는건 나눴을때 나머지가 0이니깐 나누고 나머지가 0이면 answer에다가 다 때려박으면 된다. 다른사람들도 비슷하게 풀었을거라 생각한다.

 

4. 햄버거 가게에서 일을 하는 상수는 햄버거를 포장하는 일을 합니다. 함께 일을 하는 다른 직원들이 햄버거에 들어갈 재료를 조리해 주면 조리된 순서대로 상수의 앞에 아래서부터 위로 쌓이게 되고, 상수는 순서에 맞게 쌓여서 완성된 햄버거를 따로 옮겨 포장을 하게 됩니다. 상수가 일하는 가게는 정해진 순서(아래서부터, 빵 – 야채 – 고기 - 빵)로 쌓인 햄버거만 포장을 합니다. 상수는 손이 굉장히 빠르기 때문에 상수가 포장하는 동안 속 재료가 추가적으로 들어오는 일은 없으며, 재료의 높이는 무시하여 재료가 높이 쌓여서 일이 힘들어지는 경우는 없습니다.

예를 들어, 상수의 앞에 쌓이는 재료의 순서가 [야채, 빵, 빵, 야채, 고기, 빵, 야채, 고기, 빵]일 때, 상수는 여섯 번째 재료가 쌓였을 때, 세 번째 재료부터 여섯 번째 재료를 이용하여 햄버거를 포장하고, 아홉 번째 재료가 쌓였을 때, 두 번째 재료와 일곱 번째 재료부터 아홉 번째 재료를 이용하여 햄버거를 포장합니다. 즉, 2개의 햄버거를 포장하게 됩니다.

상수에게 전해지는 재료의 정보를 나타내는 정수 배열 ingredient가 주어졌을 때, 상수가 포장하는 햄버거의 개수를 return 하도록 solution 함수를 완성하시오.

ㅇ 내가푼 코드

1트

public static int solution(int[] ingredient) {
        int answer = 0;
        int[] pattern = {1,2,3,1};
        //빵-야채-고기-빵(1-2-3-1)순서대로 있으면 answer++
        //ingredient 스택만들고 넣음. 1,2,3,1이 들어가는순간 pop해주고, 다음에 넣는다.
        Stack<Integer> s = new Stack();
        int patternIdx = 0;
        for(int num : ingredient){
            s.push(num);
            //ingredient 의 원소들을 하나씩 s에 넣고, 넣는걸 pattern의 원소와 비교하고 같으면 patternIdx++;
            if(num == pattern[patternIdx]){
                patternIdx++;
                // patternIdx가 4가되면() 1,3,2,1 순으로 뽑고 patternIdx 초기화하고, answer++
                if(patternIdx == pattern.length){
                    for(int i = 0; i < pattern.length; i++){
                        s.pop();
                    }
                    patternIdx = 0;
                    answer++;
                }
            } else {
                patternIdx = 0;
            }
        }
        

        return answer;
    }

이렇게 했을떄 문제는 1,1이렇게 1이 연속으로 나올때, 첫번째 1이 나오면 patternIdx 는1이 되고 다음 1이 나오면 pattern의 2와 비교하면서, 다시 patternIdx를 0으로 초기화 한다.

2트

public static int solution(int[] ingredient) {
        int answer = 0;
        int[] pattern = {1,2,3,1};
        //빵-야채-고기-빵(1-2-3-1)순서대로 있으면 answer++
        //ingredient 스택만들고 넣음. s에 pattern이 들어간지 검증해야함.
        Stack<Integer> s = new Stack();
        int patternIdx = 0;
        for(int num : ingredient){
            s.push(num);
            System.out.println(s);
            //ingredient 의 원소들을 하나씩 s에 넣고, 넣는걸 pattern의 원소와 비교하고 같으면 patternIdx++;
            if(num == pattern[patternIdx]){
                patternIdx++;
                System.out.println(patternIdx);
                // patternIdx가 4가되면() 1,3,2,1 순으로 뽑고 patternIdx 초기화하고, answer++
                if(patternIdx == 4){
                    for(int i = 0; i < 4; i++){
                        s.pop();
                    }
                    patternIdx = 0;
                    answer++;
                }
            } else if (num == pattern[0]) {
                patternIdx = 1;
            } else {
                patternIdx = 0;
            }
        }


        return answer;
    }

else if 문을 하나 추가해서 다시 1이 나온다면 patternIdx를 1로 초기화해서, 1이 연속으로 나오는걸 해결했다. 하지만 이제 ingredient[] 가 {2,1,1,2,3,1,2,3,1}로 주어질 때, 먼저나온 1과 뒤에 2,3,1을 빼주기엔 이 방법으론 되지않는다.

그래서 새로다시 풀었다.

3트

public static int solution(int[] ingredient) {
            int answer = 0;
            int[] pattern = {1, 2, 3, 1};
            //ingredient를 넣을 스택을 하나 만든다.
            Stack<Integer> s = new Stack<>();
            //ingredient의 엘리먼트를 s에 하나씩 집어넣는다.
            for (int num : ingredient) {
                s.push(num);

                // s의 길이가 패턴길이(4) 이상일때,
                if (s.size() >= pattern.length) {
                    boolean isPattern = true;
                    //패턴 길이만큼 반복
                    for (int i = 0; i < pattern.length; i++) {
                        //s의길이-패턴길이+i가 패턴의i와 같지 않다면, isPattern = false;
                        if (s.get(s.size() - pattern.length + i) != pattern[i]) {
                            isPattern = false;
                            break;
                        }
                    }
                    //만약 패턴이면
                    if (isPattern) {
                        // 패턴과 일치하는 부분을 스택에서 제거
                        for (int i = 0; i < pattern.length; i++) {
                            s.pop();
                        }
                        //제거하고 answer++
                        answer++;
                    }
                }
            }

            return answer;
        }

레벨1인데 굉장히 어려웠다.

 

ㅇ 다른분들의 코드

public int solution(int[] ingredient) {
        int[] stack = new int[ingredient.length];
        int sp = 0;
        int answer = 0;
        for (int i : ingredient) {
            stack[sp++] = i;
            if (sp >= 4 && stack[sp - 1] == 1
                && stack[sp - 2] == 3
                && stack[sp - 3] == 2
                && stack[sp - 4] == 1) {
                sp -= 4;
                answer++;
            }
        }
        return answer;
    }

조건문에다가 한번에 패턴을 넣었다. 어떻게 이런 생각을 하지 싶다. 이 코드를 보고 내 코드를 보면 그저 한숨만 나온다. 나도 언젠가 이렇게 풀수 있겠지?

위의문제들이 너무 쉽길래 좀 어려운걸 풀려고 했는데 난이도가 너무 확뛰었다ㅋㅋ 다시 쉬운거부터 차근차근 풀어보자.

 

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

ㅇ 내가푼 코드

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

이건 뭐.. 코테 처음 시작했을 무렵에 풀던 문제라 설명없이 넘어가겠다.

 

가끔 이렇게 Lv1문제들로 리프레시 하는것도 나쁘지 않다.