728x90
반응형
SMALL

문제 설명

두 문자열 s와 skip, 그리고 자연수 index가 주어질 때, 다음 규칙에 따라 문자열을 만들려 합니다. 암호의 규칙은 다음과 같습니다.

  • 문자열 s의 각 알파벳을 index만큼 뒤의 알파벳으로 바꿔줍니다.
  • index만큼의 뒤의 알파벳이 z를 넘어갈 경우 다시 a로 돌아갑니다.
  • skip에 있는 알파벳은 제외하고 건너뜁니다.

예를 들어 s = "aukks", skip = "wbqd", index = 5일 때, a에서 5만큼 뒤에 있는 알파벳은 f지만 [b, c, d, e, f]에서 'b'와 'd'는 skip에 포함되므로 세지 않습니다. 따라서 'b', 'd'를 제외하고 'a'에서 5만큼 뒤에 있는 알파벳은 [c, e, f, g, h] 순서에 의해 'h'가 됩니다. 나머지 "ukks" 또한 위 규칙대로 바꾸면 "appy"가 되며 결과는 "happy"가 됩니다.

두 문자열 s와 skip, 그리고 자연수 index가 매개변수로 주어질 때 위 규칙대로 s를 변환한 결과를 return하도록 solution 함수를 완성해주세요.


제한사항

  • 5 ≤ s의 길이 ≤ 50
  • 1 ≤ skip의 길이 ≤ 10
  • s와 skip은 알파벳 소문자로만 이루어져 있습니다.
    • skip에 포함되는 알파벳은 s에 포함되지 않습니다.
  • 1 ≤ index ≤ 20

입출력 예

s skip index result

"aukks" "wbqd" 5 "happy"

입출력 예 설명

입출력 예 #1

본문 내용과 일치합니다.

package LV1;

public class H155652 {
    public String solution(String s, String skip, int index) {
        StringBuilder answer = new StringBuilder();  // 결과 문자열을 저장할 StringBuilder를 선언

        for (char c : s.toCharArray()) {  // 문자열 s를 한 문자씩 순회한다.
            int counter = index;  // counter 변수를 index로 초기화하고 변수는 알파벳을 몇 칸 이동할지를 결정한다.
            while (counter > 0) {  // counter가 0보다 클 동안 반복한다.
                c++;  // 문자 c를 한 칸 뒤로 이동시킨다.
                if (c > 'z') {  // 만약 문자 c가 'z'를 넘어갈 경우
                    c = 'a';  // 문자 c를 'a'로 돌려놓는다.
                }
                if (!skip.contains(String.valueOf(c))) {  // 만약 문자 c가 skip에 포함되지 않은 경우
                    counter--;  // counter를 하나 감소시킨다. 이는 실제로 알파벳을 한 칸 이동시키는 것을 의미한다.
                }
            }
            answer.append(c);  // 최종적으로 이동한 문자 c를 결과 문자열에 추가한다.
        }

        return answer.toString();  // 결과 문자열을 String 형태로 변환하여 반환한다.
    }
}

문자열 s의 각 문자를 주어진 index만큼 뒤로 이동시키면서, skip에 포함된 문자는 건너뛰는 암호화 규칙을 구현한다.

만약 이동하려는 문자가 알파벳 'z'를 넘어갈 경우, 알파벳 'a'로 돌아가게 되며, 최종적으로 변환된 문자열이 결과값으로 반환한다.

드디어 풀었다..!!! 1레벨 완료 

728x90
반응형
LIST

'알고리즘 > 프로그래머스 JAVA LV.1' 카테고리의 다른 글

옹알이 (2)  (0) 2023.06.05
문자열 나누기  (0) 2023.05.31
[카카오 인턴] 키패드 누르기  (0) 2023.05.30
대충 만든 자판  (0) 2023.05.29
신규 아이디 추천  (0) 2023.05.24
728x90
반응형
SMALL

문제 설명

머쓱이는 태어난 지 11개월 된 조카를 돌보고 있습니다. 조카는 아직 "aya", "ye", "woo", "ma" 네 가지 발음과 네 가지 발음을 조합해서 만들 수 있는 발음밖에 하지 못하고 연속해서 같은 발음을 하는 것을 어려워합니다. 문자열 배열 babbling이 매개변수로 주어질 때, 머쓱이의 조카가 발음할 수 있는 단어의 개수를 return하도록 solution 함수를 완성해주세요.


제한사항

  • 1 ≤ babbling의 길이 ≤ 100
  • 1 ≤ babbling[i]의 길이 ≤ 30
  • 문자열은 알파벳 소문자로만 이루어져 있습니다.

입출력 예

babbling result

["aya", "yee", "u", "maa"] 1
["ayaye", "uuu", "yeye", "yemawoo", "ayaayaa"] 2

입출력 예 설명

입출력 예 #1

  • ["aya", "yee", "u", "maa"]에서 발음할 수 있는 것은 "aya"뿐입니다. 따라서 1을 return합니다.

입출력 예 #2

  • ["ayaye", "uuuma", "yeye", "yemawoo", "ayaayaa"]에서 발음할 수 있는 것은 "aya" + "ye" = "ayaye", "ye" + "ma" + "woo" = "yemawoo"로 2개입니다. "yeye"는 같은 발음이 연속되므로 발음할 수 없습니다. 따라서 2를 return합니다.

유의사항

  • 네 가지를 붙여 만들 수 있는 발음 이외에는 어떤 발음도 할 수 없는 것으로 규정합니다. 예를 들어 "woowo"는 "woo"는 발음할 수 있지만 "wo"를 발음할 수 없기 때문에 할 수 없는 발음입니다.
class Solution {
    public int solution(String[] babbling) {
        String[] sounds = {"aya", "ye", "woo", "ma"};
        int answer = 0;
        
        for (String word : babbling) {
            boolean isValid = true;

            // 연속된 같은 발음이 없는지 확인
            for (String sound : sounds) {
                if (word.contains(sound + sound.charAt(0))) {
                    isValid = false;
                    break;
                }
            }

            // "aya", "ye", "woo", "ma" 조합으로만 이루어져 있는지 확인
            if (isValid) {
                String tempWord = word;
                for (String sound : sounds) {
                    tempWord = tempWord.replaceAll(sound, "");
                }

                if (!tempWord.isEmpty()) {
                    isValid = false;
                }
            }

            if (isValid) {
                answer++;
            }
        }

        return answer;
    }
}

테스트 9, 10, 12, 13, 14, 19 20 실패

package LV1;

public class H133499 {
    public int solution(String[] babbling) {
        // 발음 가능한 단어의 개수를 저장할 변수를 0으로 초기화한다.
        int answer = 0;

        // babbling 배열의 각 단어에 대해 검사를 진행한다.
        for (String s : babbling) {
            // 먼저, 연속된 같은 발음("ayaaya", "yeye", "woowoo", "mama")이 있는지 검사하고
            // 그것들을 공백으로 바꾸어 제거한다.
            s = s.replaceAll("ayaaya|yeye|woowoo|mama", " ");

            // 그 다음, 유효한 발음("aya", "ye", "woo", "ma")이 있는지 검사하고
            // 그것들을 제거한다. 이제 s 문자열에는 유효하지 않은 발음만 남아있게 된다.
            s = s.replaceAll("aya|ye|woo|ma", "");

            // s 문자열이 비어 있다면, 원래의 단어는 유효한 발음만으로 이루어져 있고
            // 같은 발음이 연속해서 나타나지 않았다는 것을 의미한다.
            // 따라서 발음 가능한 단어의 개수를 1 증가시킨다.
            if (s.equals(""))
                answer++;
        }

        // 마지막으로, 발음 가능한 단어의 개수를 반환한다.
        return answer;
    }
}

머쓱이의 조카가 발음할 수 있는 단어인지 판별한다.

조카는 "aya", "ye", "woo", "ma" 네 가지 발음만 할 수 있고, 같은 발음이 연속해서 나타나면 발음하기 어렵다.

따라서 이 조건들을 만족하는 단어가 몇 개인지 세는 것이 이 문제의 목표한다.

이를 위해 우선 같은 발음이 연속해서 나타나는 경우를 제거하고, 그 다음에 유효한 발음을 제거하고 남은 문자열이 비어 있는지 확인한다.

문자열이 비어 있다면 원래 단어는 조건을 만족한다는 것을 의미하므로 카운터를 증가시킨다.

728x90
반응형
LIST

'알고리즘 > 프로그래머스 JAVA LV.1' 카테고리의 다른 글

둘만의 암호  (0) 2023.06.07
문자열 나누기  (0) 2023.05.31
[카카오 인턴] 키패드 누르기  (0) 2023.05.30
대충 만든 자판  (0) 2023.05.29
신규 아이디 추천  (0) 2023.05.24
728x90
반응형
SMALL

문제 설명

문자열 s가 입력되었을 때 다음 규칙을 따라서 이 문자열을 여러 문자열로 분해하려고 합니다.

  • 먼저 첫 글자를 읽습니다. 이 글자를 x라고 합시다.
  • 이제 이 문자열을 왼쪽에서 오른쪽으로 읽어나가면서, x와 x가 아닌 다른 글자들이 나온 횟수를 각각 셉니다. 처음으로 두 횟수가 같아지는 순간 멈추고, 지금까지 읽은 문자열을 분리합니다.
  • s에서 분리한 문자열을 빼고 남은 부분에 대해서 이 과정을 반복합니다. 남은 부분이 없다면 종료합니다.
  • 만약 두 횟수가 다른 상태에서 더 이상 읽을 글자가 없다면, 역시 지금까지 읽은 문자열을 분리하고, 종료합니다.

문자열 s가 매개변수로 주어질 때, 위 과정과 같이 문자열들로 분해하고, 분해한 문자열의 개수를 return 하는 함수 solution을 완성하세요.


제한사항

  • 1 ≤ s의 길이 ≤ 10,000
  • s는 영어 소문자로만 이루어져 있습니다.

입출력 예

s result

"banana" 3
"abracadabra" 6
"aaabbaccccabba" 3

입출력 예 설명

입출력 예 #1

s="banana"인 경우 ba - na - na와 같이 분해됩니다.

입출력 예 #2

s="abracadabra"인 경우 ab - ra - ca - da - br - a와 같이 분해됩니다.

입출력 예 #3

s="aaabbaccccabba"인 경우 aaabbacc - ccab - ba와 같이 분해됩니다.

package LV1;

public class H140108 {
    public int solution(String s) {
        int answer = 0; // 분해된 문자열의 개수를 저장할 변수
        int i = 0; // 문자열 s를 탐색할 인덱스

        // 문자열의 끝까지 탐색
        while (i < s.length()) {
            char x = s.charAt(i); // 첫 번째 문자를 x라고 함
            int xCount = 0; // x와 같은 문자의 개수를 저장할 변수
            int notXCount = 0; // x와 다른 문자의 개수를 저장할 변수

            // 문자열의 끝까지 혹은 x와 x가 아닌 문자의 개수가 같아질 때까지 탐색
            while (i < s.length()) {
                char currentChar = s.charAt(i); // 현재 문자

                // 현재 문자가 x와 같은지, 다른지에 따라 카운트를 증가
                if (currentChar == x) {
                    xCount++;
                } else {
                    notXCount++;
                }

                // x와 x가 아닌 문자의 개수가 같아지면 문자열 분해 완료, 카운트를 증가시키고 루프 종료
                if (xCount == notXCount) {
                    answer++;
                    break;
                }
                i++;
            }
            // 문자열의 끝까지 탐색했지만 x와 x가 아닌 문자의 개수가 같지 않으면 그대로 문자열을 분해하고 카운트 증가
            if(i == s.length() && xCount != notXCount) {
                answer++;
            }
            // 다음 문자열 분석을 위해 인덱스를 증가시킴
            i++;
        }
        return answer; // 분해된 문자열의 개수를 반환
    }
}

각 문자열을 분석하면서 첫 글자와 같은 글자의 수와 첫 글자와 다른 글자의 수가 같아지는 시점을 찾고

이러한 시점이 발생하면 해당 문자열을 분리하고 카운트를 증가시킨다.

만약 모든 문자를 검토한 후에도 두 카운트가 같지 않다면, 해당 문자열을 그대로 분리하고 카운트를 증가시킨다.

이 과정을 문자열의 끝까지 반복하며, 최종적으로 분리된 문자열의 수를 반환한다.

728x90
반응형
LIST

'알고리즘 > 프로그래머스 JAVA LV.1' 카테고리의 다른 글

둘만의 암호  (0) 2023.06.07
옹알이 (2)  (0) 2023.06.05
[카카오 인턴] 키패드 누르기  (0) 2023.05.30
대충 만든 자판  (0) 2023.05.29
신규 아이디 추천  (0) 2023.05.24

+ Recent posts