알고리즘

[프로그래머스/Java] 코딩 기초 트레이닝 복습

하늘☁️ 2024. 9. 12. 22:01

 

홀짝에 따라 다른 값 반환하기

사용 언어 : Java
레벨 : 0
📎 https://school.programmers.co.kr/learn/courses/30/lessons/181932
 

프로그래머스

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

programmers.co.kr

 

문제 설명

문자열 code가 주어집니다.code를 앞에서부터 읽으면서 만약 문자가 "1"이면 mode를 바꿉니다. mode에 따라 code를 읽어가면서 문자열 ret을 만들어냅니다.
mode는 0과 1이 있으며, idx를 0 부터 code의 길이 - 1 까지 1씩 키워나가면서 code[idx]의 값에 따라 다음과 같이 행동합니다.
mode가 0일 때code[idx]가 "1"이 아니면 idx가 짝수일 때만 ret의 맨 뒤에 code[idx]를 추가합니다.code[idx]가 "1"이면 mode를 0에서 1로 바꿉니다.mode가 1일 때code[idx]가 "1"이 아니면 idx가 홀수일 때만 ret의 맨 뒤에 code[idx]를 추가합니다.code[idx]가 "1"이면 mode를 1에서 0으로 바꿉니다.
문자열 code를 통해 만들어진 문자열 ret를 return 하는 solution 함수를 완성해 주세요.
단, 시작할 때 mode는 0이며, return 하려는 ret가 만약 빈 문자열이라면 대신 "EMPTY"를 return 합니다.

 

제한사항

  • 1 ≤ code의 길이 ≤ 100,000
    • code는 알파벳 소문자 또는 "1"로 이루어진 문자열입니다.

 

입출력 예

✏️ 풀이

문제는 굉장히 긴데 그냥 1일 경우에는 mode를 바꾸고 mode가 0일 땐 짝수번째 code를, mode가 1일 땐 홀수번째 code를 한 글자씩 붙이면 되는 간단한 문제였다. 나는 그냥 code를 한 글자씩 보면서 그 글자가 1일 땐 mode를 변경하고 (boolean 사용) mode의 참거짓과 code의 홀짝인지를 판별해서 둘 다 맞으면 ret에 그 글자를 붙이도록 코드를 짰다.

class Solution {
    public String solution(String code) {
        String answer = "";
        boolean mode = false;
        for(int i = 0; i < code.length(); i++) {
            if (code.charAt(i) == '1') {
                mode = mode ? false : true;
            } else if (mode && i % 2 != 0) {
                answer += code.charAt(i);
            } else if (!mode && i % 2 == 0) {
                answer += code.charAt(i);
            }
        }
        return answer.length() == 0 ? "EMPTY" : answer;
    }
}

 

그런데 다른 사람의 풀이를 봤는데 한 고수분의 코드를 발견하였다..

 

class Solution {
    public String solution(String code) {
        StringBuilder answer = new StringBuilder();
        int mode = 0;
        for (int i = 0; i < code.length(); i++) {
            char current = code.charAt(i);
            if (current == '1') {
                mode = mode == 0 ? 1 : 0;
                continue;
            }

            if (i % 2 == mode) {
                answer.append(current);
            }
        }
        return answer.length() == 0 ? "EMPTY" : answer.toString();
    }
}

 

진짜 굉장함.. mode가 0일땐 짝수, mode가 1일 땐 홀수 라는 점을 이용해서 i를 2로 나누었을 때 mode와 동일하면... 완전히 문제의 요점을 안 것 같아서 대단하다고 느껴짐 ㅠㅠㅠ.. 한 수 배우고 갑니다 총총...

 

주사위 게임2

사용 언어 : Java
레벨 : 0
📎 https://school.programmers.co.kr/learn/courses/30/lessons/181930https://school.programmers.co.kr/learn/courses/30/lessons/181932
 

프로그래머스

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

programmers.co.kr

 

문제 설명

1부터 6까지 숫자가 적힌 주사위가 세 개 있습니다. 세 주사위를 굴렸을 때 나온 숫자를 각각 a, b, c라고 했을 때 얻는 점수는 다음과 같습니다.
세 숫자가 모두 다르다면 a + b + c 점을 얻습니다.
세 숫자 중 어느 두 숫자는 같고 나머지 다른 숫자는 다르다면 (a + b + c) × (a2 + b2 + c2 )점을 얻습니다.
세 숫자가 모두 같다면 (a + b + c) × (a2 + b2 + c2 ) × (a3 + b3 + c3 )점을 얻습니다.
세 정수 a, b, c가 매개변수로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해 주세요.

 

제한사항

  • a, b, c는 1이상 6이하의 정수입니다.

 

입출력 예

✏️ 풀이

이 문제는 전부 다를 경우 각 변수를 1제곱한 값을 답에 곱해주고, 하나만 다를 경우 2제곱한 값까지 곱해주고, 모두 같을 경우 3제곱한 값까지 곱해주는 것이라서 count 변수를 선언해서 if문에서 각 변수들이 같은지 확인하고 같으면 하나씩 count를 증가시켜주고, for문에서 count 만큼 제곱한 값을 정답에 곱해주는 식으로 풀었다.

 

class Solution {
    public int solution(int a, int b, int c) {
        int answer = 1;
        int count = 1;

        if(a == b || b == c || c == a)
            count++;

        if(a == b && b == c)
            count++;

        for(int i = 1; i <= count; i++) {
            answer *= Math.pow(a, i) + Math.pow(b, i) + Math.pow(c, i);
        }
        
        return answer;
    }
}

 

오랜만에 코테 복습 좀 할 겸 입문문제를 좀 풀어봤는데 역시 코딩은 꾸준히 해야한다.. 며칠 안하니까 벌써 까먹고 난리,, 다시 오늘부터 꾸준히 해보려고 한다! 화이띵