프로그래머스 풀이: 주사위게임 2(자바, Java)
[프로그래머스] Level 0 주사위게임2 문제 세 주사위를 던졌을 때 나온 숫자를 각각 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 메서드를 작성하라. 나의 답안 주사위 4개인 문제의 경우처럼 배열을 활용하여 오름차순 정렬 후 if문을 작성했는데, 다른 답안들을 보니 굳이 배열을 사용할 필요 없이 훨씬 효율적이고 간결한 ..
2024.04.10
프로그래머스 풀이: 코드 처리하기 (자바, Java)
[프로그래머스] Level 0 코드 처리하기 문제 문자열 code가 주어집니다. code를 앞에서부터 읽으면서 만약 문자가 "1"이면 mode를 바꿉니다. mode에 따라 code를 읽어가면서 문자열 ret을 만들어냅니다. mode는 0과 1이 있으며, i를 0부터 code의 길이 - 1까지 1씩 키워나가면서 code[i] 값에 따라 다음과 같이 행동합니다. mode = 0일 때 code[i]가 "1"이 아니면 i가 짝수일 때만 ret의 맨 뒤에 code[i]를 추가합니다. code[i]가 "1"이면 mode를 0에서 1로 바꿉니다. mode = 1일 때 code[i]가 "1"이 아니면 i가 홀수일 때만 ret의 맨 뒤에 code[i]를 추가합니다. code[i]가 "1"이면 mode를 1에서 0으로 바..
2024.04.09
프로그래머스 풀이: 완주하지 못한 선수 (자바, Java)
[프로그래머스] Level 1 완주하지 못한 선수 문제 마라톤 경주에서 참가자들 중 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다. 마라톤 참가 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요. 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다. completion의 길이는 participant의 길이보다 1 작습니다. 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다. 참가자 중에는 동명이인이 있을 수 있습니다. 나의 답안(효율성 테스트 탈락) 리스트로 변환한 후, 완주한 참가자의 이름..
2024.04.08
프로그래머스 풀이: 폰켓몬 (자바, Java)
[프로그래머스] Level 1 폰켓몬 문제 박사님은 당신에게 자신의 연구실에 있는 총 N 마리의 폰켓몬 중에서 N/2마리를 가져가도 좋다고 했습니다. 홍 박사님 연구실의 폰켓몬은 종류에 따라 번호를 붙여 구분합니다. 따라서 같은 종류의 폰켓몬은 같은 번호를 가지고 있습니다. 예를 들어 연구실에 총 4마리의 폰켓몬이 있고, 각 폰켓몬의 종류 번호가 [3번, 1번, 2번, 3번]이라면 이는 3번 폰켓몬 두 마리, 1번 폰켓몬 한 마리, 2번 폰켓몬 한 마리가 있음을 나타냅니다. 이때, 4마리의 폰켓몬 중 2마리를 고르는 방법은 다음과 같이 6가지가 있습니다. 첫 번째(3번), 두 번째(1번) 폰켓몬을 선택 첫 번째(3번), 세 번째(2번) 폰켓몬을 선택 첫 번째(3번), 네 번째(3번) 폰켓몬을 선택 두 번..
2024.04.07
프로그래머스 풀이: 주사위게임3 (자바, Java)
[프로그래머스] Level 0 주사위게임3 너무 어려웠다. 오랜 시간 머리를 쥐어짰지만 아직은 역부족인가보다. 결국 노가다에 가까운 코드를 만들어 억지로 정답을 맞췄다... 문제 1부터 6까지 숫자가 적힌 네 주사위를 굴렸을 때 나온 숫자에 따라 다음과 같은 점수를 얻는다. 네 주사위에서 나온 숫자가 모두 p로 같다면 1111 × p점 세 주사위에서 나온 숫자가 p로 같고 나머지 다른 주사위에서 나온 숫자가 q(p ≠ q)라면 (10 × p + q)2 점 주사위가 두 개씩 같은 값이 나오고, 나온 숫자를 각각 p, q(p ≠ q)라고 한다면 (p + q) × |p - q|점 어느 두 주사위에서 나온 숫자가 p로 같고 나머지 두 주사위에서 나온 숫자가 각각 p와 다른 q, r(q ≠ r)이라면 q × r점..
2024.04.05
프로그래머스 문제: 옹알이 (자바, Java)
[프로그래머스] Level 0 옹알이 Level 0 중 가장 정답률이 낮길래 풀어봤다. 문제 태어난 지 6개월밖에 되지 않은 조카는 아직 "aya", "ye", "woo", "ma" 네 가지 발음을 최대 한 번씩 사용해 이어 붙인 발음밖에 하지 못 한다고 한다. 문자열 배열 babbling이 매개변수로 주어질 때, 조카가 발음할 수 있는 단어의 개수를 return하도록 메서드를 완성하라 나의 답안 class Solution { public int solution(String[] babbling) { int answer = 0; String[] canSay = {"aya", "ye", "woo", "ma"}; String str; for (int i = 0; i
2024.04.03
프로그래머스 문제: 홀짝에 따라 다른 값 반환하기 (자바, Java)
[프로그래머스] Level 0 홀짝에 따라 다른 값 반환하기 머리가 잘 안돌아가서 복잡하게 풀었는데, 다른 분들의 풀이를 보니 훨씬 간단하게 풀었더군요 .. 문제 양의 정수 n이 매개변수로 주어지고, n이 홀수이면 n 이하의 홀수인 모든 양의 정수의 합을 반환하고, n이 짝수면 n 이하의 짝수인 모든 양의 정수의 제곱의 합을 반환하는 메서드를 작성하라. 나의 답안 class Solution { public int solution(int n) { int oddSum = 0; int evenSum = 0; if (n % 2 == 1) { for (int i=1; i
2024.04.01

[프로그래머스] Level 0 주사위게임2

 

 

 

문제

세 주사위를 던졌을 때 나온 숫자를 각각 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 메서드를 작성하라.

 

 

 

 

나의 답안

 

주사위 4개인 문제의 경우처럼

 

배열을 활용하여 오름차순 정렬 후 if문을 작성했는데,

 

다른 답안들을 보니 굳이 배열을 사용할 필요 없이

 

훨씬 효율적이고 간결한 코드가 많이 존재했다..

 

import java.util.Arrays;

class Solution {
    public int solution(int a, int b, int c) {
        int[] dice = {a, b, c};
        Arrays.sort(dice);

        if (dice[0] != dice[1] && dice[1] != dice[2]) {
            return dice[0]+dice[1]+dice[2];
        } else if (dice[0] != dice[2]) {
            return (dice[0] + dice[1] + dice[2]) * (dice[0]*dice[0] + dice[1]*dice[1] + dice[2]*dice[2]);
        } else {
            return (dice[0] + dice[1] + dice[2]) * (dice[0]*dice[0] + dice[1]*dice[1] + dice[2]*dice[2]) * (dice[0]*dice[0]*dic
e[0] + dice[1]*dice[1]*dice[1] + dice[2]*dice[2]*dice[2]);
        }
    }
}

 

 

 

 

모범 답안

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

        int count = 1;
        if(a == b || a == c || b == c) {
            count++;
        }

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

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

        return answer;
    }

    private int pow(int a, int b) {
        if(b == 0) return 1;
        return a * pow(a, b-1);
    }
}
  • count변수를 생성하여, 단계별로 제곱 수를 결정하도록 함
  • pow메서드를 재귀함수로 별도로 선언하여 간결성 및 효율성 제고

 

상황에 따라 제곱과 세제곱이 사용된다는 점을 이용하여

정말 영리하게 작성된 코드라는 생각이 든다.

나는 언제쯤 저렇게 생각할 수 있을까..

 

 

복습

      재귀함수

  • 자신의 함수 내에서 자기 자신을 호출하는 함수
  • 반복적 연산 시 효율성을 위해 주로 사용
// 팩토리얼 구하는 메서드 작성

public int factorial(int n) {

    if (n == 0 || n == 1) {       // 종료 조건(Base Case)
        return 1;
    }
    
    return n * factorial(n - 1);     // 자기 자신 호출(Recursive Call)
}

 

[프로그래머스] Level 0 코드 처리하기

 

 

 

문제

문자열 code가 주어집니다. code를 앞에서부터 읽으면서 만약 문자가 "1"이면 mode를 바꿉니다. mode에 따라 code를 읽어가면서 문자열 ret을 만들어냅니다. mode는 0과 1이 있으며, i를 0부터 code의 길이 - 1까지 1씩 키워나가면서 code[i] 값에 따라 다음과 같이 행동합니다.

 

  • mode = 0일 때
    code[i]가 "1"이 아니면 i가 짝수일 때만 ret의 맨 뒤에 code[i]를 추가합니다.
    code[i]가 "1"이면 mode를 0에서 1로 바꿉니다.
  • mode = 1일 때
    code[i]가 "1"이 아니면 i가 홀수일 때만 ret의 맨 뒤에 code[i]를 추가합니다.
    code[i]가 "1"이면 mode를 1에서 0으로 바꿉니다.


문자열 code를 통해 만들어진 문자열 ret를 return 하는 solution 함수를 완성해 주세요.
단, 시작할 때 mode는 0이며, return 하려는 ret가 만약 빈 문자열이라면 대신 "EMPTY"를 return 합니다.

 

 

 

 

나의 답안

 

조건에 맞게 mode가 1일 때와 0일 때, code[i]가 1일 때 등 if 조건문을 달아 작성하였으며,

StringBulider 변수를 선언하여 문자를 추가하도록 하였다.

 

 

class Solution {
    public String solution(String code) {
        StringBuilder temp = new StringBuilder();
        int mode = 0;

        for (int i=0; i<code.length(); i++) {
            if (mode == 0) {
                if (code.charAt(i) == '1') {
                    mode += 1;
                } else if (code.charAt(i) != '1') {
                    if (i%2 == 0) {
                        temp.append(code.charAt(i));
                    }
                }
            } else if (mode == 1) {
                if (code.charAt(i) == '1') {
                    mode -= 1;
                } else if (code.charAt(i) != '1') {
                    if (i%2 != 0) {
                        temp.append(code.charAt(i));
                    }
                }
            }
        }
        String ret = temp.toString();
        return ret.isEmpty() ? "EMPTY" : ret;
    }
}

 

 

 

 

 

모범 답안

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를 이용해 작성함으로써 중첩 if문 사용 방지
  • 문자가 '1'일 때, mode 전환 또한 삼항연산자를 사용하여 한번에 작성
  • 마지막 return 시 새로운 변수 선언 없이 바로 toString을 통해 StringBulider 변수를 리턴 

 

 

중첩 if문을 사용하지 않음으로써 훨씬 코드가 간결하고 가독성이 좋아졌다.

더 가독성을 높이고 효율성을 높일 수 있는 코딩이 있을지 항상 생각하며 코딩하면 좋을 듯하다.

 

 

복습

      문자열(String)

  • String.charAt(인덱스) : 해당 인덱스에 위치한 문자값을 리턴
  • String.isEmpty(): 해당 문자열이 비어있는지 확인

 

      StringBuilder

  • sb.append(문자열): 해당 문자열을 새로 추
  • sb.insert(인덱스, 문자열): 해당 위치에 문자열을 삽입 (해당 위치의 문자열을 뒤로 밀어 삽입)
  • sb.toString(): 문자열 자료형으로 변환

[프로그래머스] Level 1 완주하지 못한 선수

 

 

 

문제

마라톤 경주에서 참가자들 중 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.

마라톤 참가 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 

 

완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.

 

  • 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
  • completion의 길이는 participant의 길이보다 1 작습니다.
  • 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
  • 참가자 중에는 동명이인이 있을 수 있습니다.

 

 

 

 

 

나의 답안(효율성 테스트 탈락)

 

리스트로 변환한 후, 완주한 참가자의 이름을 하나씩 대조하여 제거한 후

 

최종적으로 리스트에 남은 1명의 참가자의 이름을 return하도록 작성하였으나,

 

효율성 테스트에서 시간 초과로 오답 처리되었다.

 

 

import java.util.ArrayList;
import java.util.Arrays;

class Solution {
    public String solution(String[] participant, String[] completion) {
        ArrayList<String> part = new ArrayList<>(Arrays.asList(participant));

        for (int i=0; i<completion.length; i++) {
            part.remove(completion[i]);
        }

        return part.get(0);
    }

 

 

 

 

 

다른 유저의 답안

import java.util.HashMap;

class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        HashMap<String, Integer> hm = new HashMap<>();
        for (String player : participant) hm.put(player, hm.getOrDefault(player, 0) + 1);
        for (String player : completion) hm.put(player, hm.get(player) - 1);

        for (String key : hm.keySet()) {
            if (hm.get(key) != 0){
                answer = key;
            }
        }
        return answer;
    }
}

 

  • HashMap을 생성, 참가자 value값 +1, 완주자 value값 -1
  • getOrDefault 메서드를 사용하여 동명이인 있을 경우 오류에도 대비
    (HashMap에서는 같은 key값이 선언될 경우 value값이 변경되어 등록됨)

 

 

 

getOrDefault를 사용하는 부분에서 감탄했다.

이런 메서드들을 적재적소에 잘 활용할 수 있는 개발자가 되어야지..

 

 

복습

       리스트(List)

  • a.add(요솟값) : 해당 리스트에 원하는 요솟값을 추가
  • a.remove(인덱스): 해당위치 항목 삭제, 그 요솟값 리턴
  • a.remove(요솟값): 해당 요솟값을 삭제, true/false리턴
  • a.get(인덱스): 해당위치 요솟값 리턴

 

      맵(Map)

  • a.put(key값, value값): key와 value 추가
  • a.get(key값): key에 해당하는 value값 반환
  • a.getOrDefault(key값,얻을값): key에 해당하는 value값이 없을 때, null대신 얻을값을 반환
  • a.keySet(): 모든 key값을 모아 집합 자료형으로 리턴

[프로그래머스] Level 1 폰켓몬

 

 

 

문제

 박사님은 당신에게 자신의 연구실에 있는 총 N 마리의 폰켓몬 중에서 N/2마리를 가져가도 좋다고 했습니다.
홍 박사님 연구실의 폰켓몬은 종류에 따라 번호를 붙여 구분합니다. 따라서 같은 종류의 폰켓몬은 같은 번호를 가지고 있습니다. 예를 들어 연구실에 총 4마리의 폰켓몬이 있고, 각 폰켓몬의 종류 번호가 [3번, 1번, 2번, 3번]이라면 이는 3번 폰켓몬 두 마리, 1번 폰켓몬 한 마리, 2번 폰켓몬 한 마리가 있음을 나타냅니다. 이때, 4마리의 폰켓몬 중 2마리를 고르는 방법은 다음과 같이 6가지가 있습니다.

 

  • 첫 번째(3번), 두 번째(1번) 폰켓몬을 선택
  • 첫 번째(3번), 세 번째(2번) 폰켓몬을 선택
  • 첫 번째(3번), 네 번째(3번) 폰켓몬을 선택
  • 두 번째(1번), 세 번째(2번) 폰켓몬을 선택
  • 두 번째(1번), 네 번째(3번) 폰켓몬을 선택
  • 세 번째(2번), 네 번째(3번) 폰켓몬을 선택

이때, 첫 번째(3번) 폰켓몬과 네 번째(3번) 폰켓몬을 선택하는 방법은 한 종류(3번 폰켓몬 두 마리)의 폰켓몬만 가질 수 있지만, 다른 방법들은 모두 두 종류의 폰켓몬을 가질 수 있습니다. 따라서 위 예시에서 가질 수 있는 폰켓몬 종류 수의 최댓값은 2가 됩니다.


당신은 최대한 다양한 종류의 폰켓몬을 가지길 원하기 때문에, 최대한 많은 종류의 폰켓몬을 포함해서 N/2마리를 선택하려 합니다. N마리 폰켓몬의 종류 번호가 담긴 배열 nums가 매개변수로 주어질 때, N/2마리의 폰켓몬을 선택하는 방법 중, 가장 많은 종류의 폰켓몬을 선택하는 방법을 찾아, 그때의 폰켓몬 종류 번호의 개수를 return 하는 함수를 완성하세요

 

 

 

 

 

나의 답안

 

리스트를 만들어, 입력받은 배열의 요소들을 중복되는 값을 제외하여 값을 추가하였고,

 

N/2와 리스트 요소의 개수 중 더 작은 값을 반환하도록 작성하였다.

 

 

import java.util.*;

class Solution {
    public int solution(int[] nums) {     
        ArrayList<Integer> types = new ArrayList<>();
        
        for (int i=0; i<nums.length; i++) {            
            if (types.contains(nums[i]) == false) {                
                types.add(nums[i]);
            }
        }
        
        return Math.min(types.size(), nums.length/2);
    }
}

 

 

 

 

다른 유저의 답안

import java.util.HashSet;

class Solution {
    public int solution(int[] nums) {

            HashSet<Integer> hs = new HashSet<>();

            for(int i =0; i<nums.length;i++) {
                hs.add(nums[i]);
            }

            if(hs.size()>nums.length/2)
                return nums.length/2;

            return hs.size();
    }
}
  • 리스트 대신 Set 타입으로 값을 담아, 자동으로 중복을 제외하도록 작성
  • 그래서인지 코드 읽을 때 더 간결해 보임

 

 

HashSet을 많이 사용해보지 않아 Set자료형을 활용할 생각을 못했다.

다음에 중복을 제거해야 할 경우에는 Set자료형을 활용하자!

 

 

복습

  • a.add(요소값) : 해당 리스트에 원하는 요 솟값을 추가함
  • a.size() : 해당 리스트의 요소 개수를 리턴
  • a.contains(요솟값) : 해당 리스트에 해당 요솟값이 있는지 확인
  • 리스트 선언 방법
    1) ArrayList<Integer> a = new ArrrayList<>();
    2) ArrayList<Integer> a = new ArrrayList<>(Arrays.asList(1, 2, 3, 4));

 

[프로그래머스] Level 0 주사위게임3

 

너무 어려웠다.

오랜 시간 머리를 쥐어짰지만 아직은 역부족인가보다.

결국 노가다에 가까운 코드를 만들어

억지로 정답을 맞췄다...

 

 

 

문제

1부터 6까지 숫자가 적힌 네 주사위를 굴렸을 때 나온 숫자에 따라 다음과 같은 점수를 얻는다.

 

  • 네 주사위에서 나온 숫자가 모두 p로 같다면 1111 × p점
  • 세 주사위에서 나온 숫자가 p로 같고 나머지 다른 주사위에서 나온 숫자가 q(p ≠ q)라면 (10 × p + q)2 점
  • 주사위가 두 개씩 같은 값이 나오고, 나온 숫자를 각각 p, q(p ≠ q)라고 한다면 (p + q) × |p - q|점
  • 어느 두 주사위에서 나온 숫자가 p로 같고 나머지 두 주사위에서 나온 숫자가 각각 p와 다른 q, r(q ≠ r)이라면 q × r점
  • 네 주사위에 적힌 숫자가 모두 다르다면 나온 숫자 중 가장 작은 숫자 만큼의 점수를 얻습니다.

네 주사위를 굴렸을 때 나온 숫자가 정수 매개변수 a, b, c, d로 주어질 때, 얻는 점수를 return 하는 메서드를 작성하라

 

 

 

 

 

나의 답안

 

공개하기 부끄럽다...

import java.util.*;

class Solution {
    public int solution(int a, int b, int c, int d) {
        
        int ab = a==b ? 1 : 0;
        int ac = a==c ? 1 : 0;
        int ad = a==d ? 1 : 0;
        int bc = b==c ? 1 : 0;
        int bd = b==d ? 1 : 0;
        int cd = c==d ? 1 : 0;
        String result = ""+ab+ac+ad+bc+bd+cd;
        
        switch (result) {
            case "111111":
                return 1111 * a;
            case "110100":
                return (10 * a + d) * (10 * a + d);
            case "101010":
                return (10 * a + c) * (10 * a + c);
            case "011001":
                return (10 * a + b) * (10 * a + b);
            case "000111":
                return (10 * b + a) * (10 * b + a);
            case "100001":
                return (a + c) * (a - c) > 0 ? (a + c) * (a - c) : (a + c) * (a - c) * -1;
            case "010010":
                return (a + b) * (a - b) > 0 ? (a + b) * (a - b) : (a + b) * (a - b) * -1;
            case "001100":
                return (a + b) * (a - b) > 0 ? (a + b) * (a - b) : (a + b) * (a - b) * -1;
            case "100000":
                return c * d;
            case "010000":
                return b * d;
            case "001000":
                return b * c;
            case "000100":
                return a * d;
            case "000010":
                return a * c;
            case "000001":
                return a * b;
            default:
                ArrayList<Integer> numbers = new ArrayList<>(Arrays.asList(a, b, c, d));
                return Collections.min(numbers);
        }
    }
}
        

 

 

 

다른 유저의 답안

import java.util.Arrays;

class Solution {
    public int solution(int a, int b, int c, int d) {

        int[] dice = { a, b, c, d };
        Arrays.sort(dice);             //배열로 저장 후 오름차순정렬

        int ans = 0;

        if (dice[0] == dice[3]) { 
            ans = 1111 * dice[3];         //4개 모두 같을 때
        } else if (dice[0] == dice[2] || dice[1] == dice[3]) { 
            ans = (int) Math.pow(dice[1] * 10 + (dice[0] + dice[3] - dice[1]), 2);     // 3개만 같을 때
        } else if (dice[0] == dice[1] && dice[2] == dice[3]) {     
            ans = (dice[0] + dice[3]) * (dice[3] - dice[0]);       // 2개씩 같을 때
        } else if (dice[0] == dice[1]) {         
            ans = dice[2] * dice[3];
        } else if (dice[1] == dice[2]) {
            ans = dice[0] * dice[3];
        } else if (dice[2] == dice[3]) {
            ans = dice[0] * dice[1];                // 2개만 같을 때
        } else {
            ans = dice[0];            // 모두 다를 때
        }

        return ans;
    }
}
  • 정렬을 이용하여 케이스를 나누기 용이하게 함
  • 가장 작은 수를 추출하기에도 용이함

 

복습

  • 배열 오름차순 정렬 :  Arrays.sort(배열)
  • 배열 선언과 동시에 값 입력 : int[] arr = {1, 2, 3, 4, 5};

[프로그래머스] Level 0 옹알이

 

Level 0 중 가장 정답률이 낮길래 풀어봤다.

 

 

문제

태어난 지 6개월밖에 되지 않은 조카는 아직 "aya", "ye", "woo", "ma" 네 가지 발음을 최대 한 번씩 사용해 이어 붙인 발음밖에 하지 못 한다고 한다. 문자열 배열 babbling이 매개변수로 주어질 때, 조카가 발음할 수 있는 단어의 개수를 return하도록 메서드를 완성하라

 

 

 

 

 

나의 답안

class Solution {
    public int solution(String[] babbling) {
        int answer = 0;
        String[] canSay = {"aya", "ye", "woo", "ma"};
        String str;

        for (int i = 0; i < babbling.length; i++) {
            str = babbling[i];

            for (int j = 0; j < canSay.length; j++) {

                if (str.length() != 0 && str.contains(canSay[j])) {

                    if (str.equals(babbling[i])) {
                        str = babbling[i].replaceAll(canSay[j], "-");
                    } else {
                        str = str.replaceAll(canSay[j], "-");
                    }
                }
            }

            if (str.replaceAll("-", "").isEmpty()) {
                answer++;
            }
        }

        return answer;
    }
}

 

 

 

 

 

다른 유저의 답안

class Solution {
    public int solution(String[] babbling) {
        int answer = 0;

        for(int i =0; i < babbling.length; i++) {
            babbling[i] = babbling[i].replace("aya", "1");         
            babbling[i] = babbling[i].replace("woo", "1");
            babbling[i] = babbling[i].replace("ye", "1");
            babbling[i] = babbling[i].replace("ma", "1");      //해당하는 문자열이 있으면 1로 변환
                                                                                    //replace → replaceFirst 로 변경해야함!
            babbling[i] = babbling[i].replace("1", "");         //1을 제거
            if(babbling[i].isEmpty()) {      
                answer = answer + 1;
            }
        }

        return answer;
    }
}

 

  • 불필요하게 canSay배열 및 Babbling의 각 항목을 넣기 위한 문자열 변수(str)를 선언하지 않음 (성능, 가독성 ↑)
  • for문을 1번만 사용함
  • 단, "ayaaya"와 같은 중복이 발생해도 카운트가 된다. 따라서 replace() 대신 첫번째 해당문자만 변경해주는 replaceFirst()를 사용해야 한다!

 

복습

  • 배열의 길이 확인 :  arr.length      [괄호 사용 X]
  • 문자열의 일부를 다른 문자로 변환 :  String.replace("기존문자", "바꿀문자")
  • 문자열에 특정 문자가 포함되는지 확인 :  String.contains("문자")
  • 두 값이 같은지 확인 :  "문자".equals("문자")

[프로그래머스] Level 0 홀짝에 따라 다른 값 반환하기

 

머리가 잘 안돌아가서 복잡하게 풀었는데, 다른 분들의 풀이를 보니 훨씬 간단하게 풀었더군요 ..

 

 

문제

양의 정수 n이 매개변수로 주어지고, n이 홀수이면 n 이하의 홀수인 모든 양의 정수의 합을 반환하고, n이 짝수면 n 이하의 짝수인 모든 양의 정수의 제곱의 합을 반환하는 메서드를 작성하라.

 

 

 

 

 

나의 답안

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

        if (n % 2 == 1) {
            for (int i=1; i <= n; i++) {
                if (i % 2 != 0) {
                    oddSum += i;
                }
            }
            return oddSum;
        } else {
            for (int i=1; i <= n; i++) {
                if (i % 2 == 0) {
                    evenSum += i*i;
                }
            }
            return evenSum;
        }
    }
}

 

 

 

보완사항

  • sum 값을 불필요하게 oddSum, evenSum으로 나누어 선언할 필요 없이 하나의 변수 sum으로 선언
  • for문에서 i값을 2씩 증가시키기

 

class Solution {
    public int solution(int n) {
        int sum = 0;    // 변수 1개만 생성

        if (n % 2 == 1) {
            for (int i = 1; i <= n; i += 2) {    // i값 2씩 증가
                sum += i;
            }
        } else {
            for (int i = 2; i <= n; i += 2) { 
                sum += i * i; 
            }
        }
        return sum;
    }
}