[프로그래머스] 6: 가운데 글자 가져오기, 수박수박수박수박수박수?, 내적, 약수의 개수와 덧셈, 옹알이(1), 정수를 나선형으로 배치하기

서예진·2024년 1월 16일
0
post-custom-banner

🔥오늘부터 Lv.1 3~4문제와 오답률 높은 Lv.0 2문제 풀기🔥

[목차]
▸ Lv.1
1. 가운데 글자 가져오기
2. 수박수박수박수박수박수?
3. 내적
4. 약수의 개수와 덧셈
▸ Lv.0
5. 옹알이(1)
6. 정수를 나선형으로 배치하기

1. 가운데 글자 가져오기 : Lv.1

💡문제
단어 s의 가운데 글자를 반환하는 함수, solution을 만들어 보세요. 단어의 길이가 짝수라면 가운데 두글자를 반환하면 됩니다.

▼ 코드

class Solution {
    public String solution(String s) {
        String answer = "";
        char[] charArray = s.toCharArray();
        int middleNumber = charArray.length/2 - 1;
        if(charArray.length % 2 != 0){
            middleNumber += 1;
            answer = String.valueOf(charArray[middleNumber]);
        } else {
            answer = String.valueOf(charArray[middleNumber]);
            middleNumber += 1;
            answer += charArray[middleNumber];
        }
        return answer;
    }
}
  • 먼저 if문을 사용하여 문자열이 홀수인지 짝수인지를 나누기
  • 그럴려면 이 문자열을 char타입의 배열로 변환해야한다.
  • 홀수일 경우, 가운데 숫자는 (배열 길이/2) + 1
  • 짝수일 경우, 가운데 두 글자는 (배열 길이/2) 와 (배열 길이/2) + 1
  • 하지만, 인덱스는 0부터 시작이여서
    홀수일 경우, (배열 길이/2)
    짝수일 경우, (배열 길이/2) -1 과 (배열 길이/2)

2. 수박수박수박수박수박수? : Lv.1

💡문제
길이가 n이고, "수박수박수박수...."와 같은 패턴을 유지하는 문자열을 리턴하는 함수, solution을 완성하세요. 예를들어 n이 4이면 "수박수박"을 리턴하고 3이라면 "수박수"를 리턴하면 됩니다.

▼ 코드

class Solution {
    public String solution(int n) {
        String answer = "";
        int repeatCount = n/2;
        for (int i = 1; i <= repeatCount; i++){
            answer += "수박";
        }
        if (n%2 != 0){
            answer += "수";
        }
        return answer;
    }
}
  • 반복수를 n/2로 저장한다.
  • 반복수만큼 "수박"을 answer에 더한다.
  • 만약 홀수라면 if문을 통해서 '수'를 문자열에 추가한다.

3. 내적 : Lv.1

💡문제
길이가 같은 두 1차원 정수 배열 a, b가 매개변수로 주어집니다. a와 b의 내적을 return 하도록 solution 함수를 완성해주세요.
이때, a와 b의 내적은 a[0]b[0] + a[1]b[1] + ... + a[n-1]*b[n-1] 입니다. (n은 a, b의 길이)

▼ 코드

class Solution {
    public int solution(int[] a, int[] b) {
        int answer = 0;
    
        for (int i = 0; i < a.length; i++){
            answer += a[i]*b[i];
        }
        return answer;
    }
}
  • for문을 돌면서 연산 수행

4. 약수의 개수와 덧셈 : Lv.1

💡문제
두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.

▼ 코드

import java.util.List;
import java.util.ArrayList;

class Solution {
    public int solution(int left, int right) {
        int answer = 0;
        List<Integer> numbers = new ArrayList<>();
        List<Integer> divisor = new ArrayList<>();
        List<Integer> divisorCount = new ArrayList<>();
        for(int i = left; i <= right; i++){
            numbers.add(i);
        }
        for(int i = left; i <= right; i++){
            divisor.clear();
            for(int j = 1; j <= i; j++){
                if(i%j==0){
                    divisor.add(i);
                }
            }
            divisorCount.add(divisor.size());
        }
        for (int i=0; i<divisorCount.size(); i++){
            if(divisorCount.get(i)%2==0){
                answer += numbers.get(i);
            } else{
                answer -= numbers.get(i);
            }
        }
        return answer;
    }
}
  • 먼저 약수를 구하는 로직을 만들고 그 결과를 리스트에 저장하기
  • left-right와 1-해당수와 같이 약수를 구하는 데 두 번의 반복이 필요하다.
  • 이중 for문을 사용하여 약수를 구하는 로직을 만든다.
    ** 만약 left에 대한 약수를 구하면 약수 리스트는 초기화 되어야 한다.
  • 약수를 구하고 약수의 개수를 다른 리스트에 저장한다.
  • 이제, 약수의 개수가 짝수면 더하고 홀수면 빼는 로직을 만들어야 한다.
  • 약수의 개수 리스트를 돌아야하기 때문에 반복문을 사용한다.
  • 홀수인 경우와 짝수인 경우를 if문을 사용하여 연산을 수행한다.
  • 이 과정에서 약수의 개수 리스트와 매칭되는 left부터 right까지의 수를 저장한 리스트가 필요하다.
  • 따라서, 약수의 개수가 짝수이면 해당 인덱스의 원래 숫자를 가져와 더하고 홀수이면 해당 인덱스의 원래 숫자를 가져와 뺀다.

5. 옹알이(1) : Lv.0

💡문제
머쓱이는 태어난 지 6개월 된 조카를 돌보고 있습니다. 조카는 아직 "aya", "ye", "woo", "ma" 네 가지 발음을 최대 한 번씩 사용해 조합한(이어 붙인) 발음밖에 하지 못합니다. 문자열 배열 babbling이 매개변수로 주어질 때, 머쓱이의 조카가 발음할 수 있는 단어의 개수를 return하도록 solution 함수를 완성해주세요.

▼ 제한사항
1 ≤ babbling의 길이 ≤ 100
1 ≤ babbling[i]의 길이 ≤ 15
babbling의 각 문자열에서 "aya", "ye", "woo", "ma"는 각각 최대 한 번씩만 등장합니다.
즉, 각 문자열의 가능한 모든 부분 문자열 중에서 "aya", "ye", "woo", "ma"가 한 번씩만 등장합니다.
문자열은 알파벳 소문자로만 이루어져 있습니다.

▼ 입출력 예

babblingresult
["aya", "yee", "u", "maa", "wyeoo"]1
["ayaye", "uuuma", "ye", "yemawoo", "ayaa"]3

▼ 코드

class Solution {
    public int solution(String[] babbling) {
        int answer =0;
        for(int i = 0; i < babbling.length; i++){
            babbling[i] = babbling[i].replace("aya", ".");
            babbling[i] = babbling[i].replace("ye", ".");
            babbling[i] = babbling[i].replace("woo", ".");
            babbling[i] = babbling[i].replace("ma", ".");
        }
        for(int i = 0; i < babbling.length; i++){
            babbling[i] = babbling[i].replace(".", "");
            if(babbling[i].isEmpty()){
                answer += 1;
            }
        }
        return answer;
    }
}
  • 가능 조합을 먼저 리스트에 저장한다. 이 리스트와 배열의 요소를 확인하여 있으면 +1을 한다. => 이 방법은 너무 비효율적
  • 먼저, 전달받은 배열을 돌면서 "aya"로 split를 한다.
  • split를 하면 결과값이 배열로 반환되므로 이 결과 배열안에 있는 요소들을 하나의 문자열로 다시 합쳐야 한다.
  • 이런 식으로 다른 발음도 분리한다.
  • 최종 배열에서 빈 문자열을 발견하면 count를 센다.
    => 오답: "wyeoo"인 경우 ye를 먼저 분리하고 woo가 합쳐진 상태에서 woo도 분리하는 로직을 거치기 때문에 count가 +1이 됨
    => 해당 문제를 푸는 중 replace 메소드를 알게 되어 replace 메소드를 적용함
    => 처음에 각 발음을 .으로 바꾸고 마지막에 .을 ""으로 바꾼 뒤, 비어있는 문자열만큼 answer +1 한다.
    🔥느낌점: 너무 어렵게만 생각하지 말기!

6. 정수를 나선형으로 배치하기 : Lv.0

💡문제
양의 정수 n이 매개변수로 주어집니다. n × n 배열에 1부터 n2 까지 정수를 인덱스 [0][0]부터 시계방향 나선형으로 배치한 이차원 배열을 return 하는 solution 함수를 작성해 주세요.

▼ 제한 사항
1 ≤ n ≤ 30

▼ 입출력 예

nresult
4[[1, 2, 3, 4], [12, 13, 14, 5], [11, 16, 15, 6], [10, 9, 8, 7]]
5[[1, 2, 3, 4, 5], [16, 17, 18, 19, 6], [15, 24, 25, 20, 7], [14, 23, 22, 21, 8], [13, 12, 11, 10, 9]]

▼ 코드

class Solution {
   public int[][] solution(int n) {
       int[][] answer = new int[n][n];
       int start = 1;
       int left = 0;
       int right = n-1;
       int top = 0;
       int bottom = n-1;
       while(start<=n*n){
           for(int i = left; i <= right; i++){
               answer[left][i] = start++;
           }
           top++;
           for(int i = top; i <= bottom; i++){
               answer[i][right] = start++;
           }
           right--;
           for(int i=right; i>=left; i--){
               answer[bottom][i] = start++;
           }
           bottom--;
           for(int i=bottom; i>= top; i--){
               answer[i][left] = start++;
           }
           left++;
       }
       
       return answer;
   }
}
  • 먼저 전달받은 n을 사용하여 정답 배열을 초기화한다.
  • 왼쪽에서 오른쪽, 위에서 아래, 오른쪽에서 왼쪽, 아래쪽에서 위쪽인 경우를 나누어 값을 채워 넣는다.
  • 이 때 채워넣는 값은 1부터 시작해서 ++로 값을 더해나간다.
  • 이 채워넣는 값이 n*n이 되는 순간 값을 채워넣는 것을 중단한다.
  • 따라서, while문 조건에 해당 조건을 넣고
    for문을 사용하여 i의 범위를 4가지 경우에 맞게 조절하고
    해당 for문이 끝났을 때 채워진 열이나 줄을 +, - 해서 i의 범위가 원활하게 한다.
profile
안녕하세요
post-custom-banner

0개의 댓글