[프로그래머스] 16 : 옹알이(2) | 숫자 짝궁 | 체육복

서예진·2024년 1월 30일
0

목차

▸ 옹알이(2)
▸ 숫자 짝궁
▸ 체육복


💡옹알이(2) : Lv.1

▼ 문제

출처: 프로그래머스 코딩테스트 연습 > 연습문제 > 옹알이(2)

▼ 내 풀이

  • 먼저 replace 메서드를 활용하여 각 발음을 다른 문자로 바꿨다.
  • 같은 발음이 연속되어도 발음을 못하므로 각 발음마다 다른 문자로 바꿨다.
  • 바꾼 문자가 같을 때, 즉 같은 발음이 연속된 경우를 센다.
  • 마지막으로 바꾼 문자도 모두 ""으로 바꾸어 배열에서 비어있는 문자열이 있는 경우를 센다.
  • 비어있는 문자열 수에서 같은 발음 연속된 문자열 수를 뺀다.
[오답 코드]
class Solution {
    public int solution(String[] babbling) {
        int answer = 0;
        int same = 0;
        
        for(int i = 0; i < babbling.length; i++){
            babbling[i] = babbling[i].replace("aya", "1");
            babbling[i] = babbling[i].replace("ye", "2");
            babbling[i] = babbling[i].replace("woo", "3");
            babbling[i] = babbling[i].replace("ma", "4");
        }
        for(int i = 0; i < babbling.length; i++){
            if(babbling[i].equals("11")){
                same++;
            } else if(babbling[i].equals("22")){
                same++;
            } else if(babbling[i].equals("33")){
                same++;
            } else if(babbling[i].equals("44")){
                same++;
            }
            
            babbling[i] = babbling[i].replace("1", "");
            babbling[i] = babbling[i].replace("2", "");
            babbling[i] = babbling[i].replace("3", "");
            babbling[i] = babbling[i].replace("4", "");
            if(babbling[i].isEmpty()){
                answer++;
            }
        }
        return answer - same;
    }
}
  • 아무래도 같은 발음이 연속된 경우를 처리하는 부분이 잘못된 것 같다.
  • 해결 방안으로 같은 발음이 연속된 경우 모두 "0"으로 바꾼다.
[수정 코드]
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("ye", "2");
            babbling[i] = babbling[i].replace("woo", "3");
            babbling[i] = babbling[i].replace("ma", "4");
        }
        for(int i = 0; i < babbling.length; i++){
            //연속된 발음인 경우도 같은 문자로 바꾸기
            babbling[i] = babbling[i].replace("11", "0");
            babbling[i] = babbling[i].replace("22", "0");
            babbling[i] = babbling[i].replace("33", "0");
            babbling[i] = babbling[i].replace("44", "0");
            
            //공백으로 바꾸기
            babbling[i] = babbling[i].replace("1", "");
            babbling[i] = babbling[i].replace("2", "");
            babbling[i] = babbling[i].replace("3", "");
            babbling[i] = babbling[i].replace("4", "");
            
            if(babbling[i].isEmpty()){
                answer++;
            }
        }
        return answer;
    }
}

💡숫자 짝궁 : Lv.1

▼ 문제

출처: 프로그래머스 코딩테스트 연습 > 연습문제 > 숫자 짝궁

▼ 내 풀이

  • 먼저, x, y에 나오는 같은 숫자를 찾는다.
  • 같은 숫자를 찾고 y 배열에 있는 같은 숫자를 제거해야 중복되지 않고 같은 숫자를 찾을 수 있다.
[오답 코드]
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;

class Solution {
    public String solution(String X, String Y) {
        String answer = "";
        int zerocnt = 0;
        char[] x = X.toCharArray();
        char[] y = Y.toCharArray();
        List<Character> same = new ArrayList<>();
        
        //같은 숫자 찾기(중복 제외)
        for(int i = 0; i < x.length; i++){
            for(int j = 0; j < y.length; j++){
                if(x[i]==y[j]){
                    same.add(x[i]);
                    y[j] = 'x';
                }
            }
        }
        
        //거꾸로 정렬
        Collections.sort(same, Collections.reverseOrder());
        if(same.size() == 0){
            same.add('-');
            same.add('1');
        }
        
        //정답 문자열 만들기
        for(Character chars : same){
            if(chars.equals('0')){
                zerocnt++;
            }
            if(zerocnt == same.size()){
                answer = "0";
            }else{
                answer += chars;
            }
        }
        
        return answer;
    }
}
  • 몇몇 테스트에서 시간초과 결과를 얻었다. 같은 숫자 찾기 부분에서 for문을 돌면서 같은지 비교하기 때문에 시간이 오래걸린 것 같다.
  • 또한, StringBuilder가 문자열을 붙일 때 +=보다 더 효율적이게 문자열을 만들 수 있다.
  • 위의 코드와 같이 같은 숫자인걸 확인하고 리스트에 추가하는 것보다 해당 숫자의 출현횟수를 저장한 배열에서 뒤에서부터 가져오는 것이 더 효율적이다.
  • 뒤에서부터 가져올 때 while문을 통해 두 배열에서 모두 출현횟수가 0보다 크면 두 문자열에서 모두 나타나는 숫자임을 알 수 있다.
[수정 코드]
class Solution {
    public String solution(String X, String Y) {
       
        int[] xCnt = new int[10];
        int[] yCnt = new int[10];
        StringBuilder stringBuilder = new StringBuilder();
        
        for(String x : X.split("")){
            xCnt[Integer.parseInt(x)]++;
        }
        for(String y : Y.split("")){
            yCnt[Integer.parseInt(y)]++;
        }
        for(int i = 9; i >= 0; i--){
            while(xCnt[i] > 0 && yCnt[i] > 0){
                stringBuilder.append(i);
                xCnt[i]--;
                yCnt[i]--;
            }
        }
        if(stringBuilder.toString().equals("")){
            return "-1";
        }else if(stringBuilder.toString().substring(0,1).equals("0")){
            return "0";
        }else{
            return stringBuilder.toString();
        }   
    }
}

💡체육복 : Lv.1

▼ 문제

출처: 프로그래머스 코딩테스트 연습 > 탐욕법(Greedy) > 체육복

▼ 내 풀이

  • 먼저 잃어버린 학생 수를 n에서 뺀다.
  • 그 다음, 여분의 체육복이 있는 학생이 잃어버린 경우, 이 학생은 더 이상 체육복을 빌려줄 수 없으므로 reserve 배열과 lost 배열에서 제거하고 answer++한다.
  • 이제 lost 배열에서 -+1 값이 reserve에 있으면 해당 reserve 값을 배열에서 제거하고 answer++ 한다.
import java.util.Arrays;
class Solution {
    public int solution(int n, int[] lost, int[] reserve) {
        int answer = n - lost.length;
        Arrays.sort(lost);
        Arrays.sort(reserve);
        
        for(int i = 0; i< lost.length; i++){
            for(int j = 0; j < reserve.length; j++){
                //여분의 체육복이 있는 학생이 잃어버린 경우
                if(lost[i] == reserve[j]){
                    lost[i] = -1;
                    reserve[j] = -1;
                    answer++;
                }
            }
        }
        
        //체육복 빌려주기
        for(int i = 0; i < lost.length; i++){
            for(int j = 0; j < reserve.length; j++){
                if(lost[i]-1 == reserve[j] || lost[i]+1 == reserve[j]){
                    reserve[j] = -1;
                    answer++;
                    break;
                }
            }
        }
        
        return answer;
    }
}
profile
안녕하세요

0개의 댓글