프로그래머스 이상한 문자 만들기 하샤드 수 (99클럽 코딩테스트 8일차 TIL)

KIMYEONGJUN·2024년 4월 4일
0
post-thumbnail

목표

하루하루 코딩을 풀면서 개발 실력이 늘기위해서 노력하고있는중이다. 하루하루 이렇게 문제를 풀면서 개발 실력이 늘어서 코딩테스트를 참가했을때 통과하는데 목표입니다.

문제

처음에는 이런식으로 의사코드를 작성했다.

입력 문자열 String s를 입력받는다
s를 공백을 기준으로 분리하여 각 단어를 나눈다
나눠진 단어들을 순회하면서 각 문자의 인덱스를 확인한다
인덱스가 짝수/홀수에 따라 해당 문자를 대문자/소문자로 변환한다
변환된 문자들을 이어붙여 새로운 문자열을 만든다

// 문자열 s는 한 개 이상의 단어로 구성되어 있다.
// 각 단어는 하나 이상의 공백문자로 구분되어 있다.
// 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴

class Solution {
    public String solution(String s) {
        String answer = "";
        
        String[] words = s.split(" ");
        for(String word : words) {
            String newWord = "";    
            for(int i = 0; i < word.length(); i++) {
                if(i % 2 == 0) {
                    newWord += Character.toUpperCase(word.charAt(i));
                } else {
                    newWord += Character.toLowerCase(word.charAt(i));
                }
            }
            answer += newWord + " ";
        }
        
        return answer.trim();
    }
}

내가 접근한 방식은 단어 단위로 접근했기 때문에 로직이 조금더 복잡했다. 문제를 해결하기 위해 꼭 단어가 아닌 문자 단위로 처리할 필요는 없었다. 그리고 문자 단위 처리로 전환할 필요가없었다.

코드를 틀려서 다시 생각을해봤다. 문자 단위로 접근한다는 점과 공백 처리 방식에서 문제가 있었던같다.

그래서 로직을 다시 새로 작성하기로했다.

// 문자열 s는 한 개 이상의 단어로 구성되어 있다.
// 각 단어는 하나 이상의 공백문자로 구분되어 있다.
// 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴


class Solution {
    public String solution(String s) {
        String answer = "";
        int cnt = 0;
        
        String[] strArr = s.split("");

        for (String nw : strArr) {
            if(nw.contains(" ")){
                cnt = 0; 
            } else {
                cnt++;
            }

            if(cnt % 2 == 0) {
                answer += nw.toLowerCase();
            } else {
                answer += nw.toUpperCase();
            }
         }
         return answer;
    }
}

입력 문자열 s를 문자 단위로 쪼개어 문자열 배열 strArr에 저장한다.
strArr를 순회하면서 각 문자(nw)를 처리해준다.
nw가 공백이면 cnt를 0으로 초기화해준다. 공백은 단어 구분을 위한 것이기 때문이다.
공백이 아니면 cnt를 1씩 증가시켜준다.
cnt값이 짝수 홀수에 따라 대소문자 변환을 한다.
변환된 문자를 누적하여 결과 문자열을 만들어준다.

다행이 통과를 할 수있었다.

// 양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야한다.
//  예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 
// 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수

class Solution {
    public boolean solution(int x) {
        int sum = 0; 
        int temp = x;

        while(temp != 0) {
            sum += temp % 10; 
            temp /= 10;
        }

        if(x % sum == 0) {
            return true;
        } else {
            return false; 
        }
    }
}

하샤드 수 정의(자리수의 합으로 숫자가 나누어 떨어지는 조건)
입력 숫자의 각 자리수 접근을 해야한다. 10으로 나눈 나머지를 통해 구현한다.
변수 sum는 각 자리수 누적 합 계산 변수 temp는 입력값 복사본, 자리수 접근 용도이다. while문은 temp의 각 자리수 계산하여 sum 누적한다.
조건문 입력값을 sum으로 나눈 나머지 확인한다.

간단하게 해결한것같다.

마무리

월요일 목요일마다 2문제씩 공부하니깐 조금씩 문제들이 익숙해지는것같다. 어렵긴하지만 조금씩 개발 실력이 늘어가는것같다.

profile
Junior backend developer

1개의 댓글

comment-user-thumbnail
2024년 4월 8일

풀이 잘 보구 갑니다!
정보처리기사.. 저도 갖고싶네용 ㅎㅎ

답글 달기