프로그래머스 문제풀이/알고리즘 (JAVA)

[JAVA] 프로그래머스 알고리즘 문제풀이 - Level 1 (69~71번 문제풀이) / Level 0 (224/224)

남건욱 2023. 11. 16. 16:19
반응형
69. 개인정보 수집 유효기간

문제

import java.util.*;

class Solution {
    public int[] solution(String today, String[] terms, String[] privacies) {
        Map<String, String> map = new HashMap<>();
        List<Integer> list = new ArrayList<>();
        
        // 주어진 날짜를 . 기준으로 나눠서 저장 후 year, month, day에 맞는 정수형으로 저장
        String[] todays = today.split("\\.");
        int year = Integer.parseInt(todays[0]);
        int month = Integer.parseInt(todays[1]);
        int day = Integer.parseInt(todays[2]);
        
        // 연도는 12개월 * 28, 달은 * 28, day는 그대로 더해줬다.
        int todayAll = (year * 12 * 28) + (month * 28) + day;
        
        // 주어진 terms를 문자와 더해야될 달 수로 구분
        for(String term : terms){
            String[] str = term.split(" ");
            map.put(str[0], str[1]);
        }
        
        
        // 반복하면서 privacies의 값을 날짜와 문자로 먼저 분리
        // 분리된 날짜를 위에서 했던 똑같은 방식으로 year, month, day로 분리
        // 분리된 문자값으로 if문을 사용해서 map에 들어있는 벨류값을 가져온뒤 달에 더해줌
        for(int i=0; i<privacies.length; i++){
            String[] privaciesAll = privacies[i].split(" ");
            String[] privaciesDay = privaciesAll[0].split("\\.");
            
            int pYear = Integer.parseInt(privaciesDay[0]);
            int pMonth = Integer.parseInt(privaciesDay[1]);
            int pDay = Integer.parseInt(privaciesDay[2]);
            
            if(map.containsKey(privaciesAll[1])){
                String addStr = map.get(privaciesAll[1]);
                int add = Integer.parseInt(addStr);
                pMonth += add;
            }
            
            // pTodayAll은 유효기간을 의미한다.
            int pTodayAll = (pYear * 12 * 28) + (pMonth * 28) + pDay;
            
            // todayAll이 크거나 같다면 유효기간이 지났다는 의미로 폐기처분을 해준다.
            if(todayAll >= pTodayAll){
                list.add(i+1);
            }    
        }
        
        int[] answer = new int[list.size()];
        for(int i=0; i<list.size(); i++){
            answer[i] = list.get(i);
        }     
         
        return answer;
    }
}

<작성한 코드>

terms를 분리할 Map을 만들어주고 폐기할 번호를 담을 list를 생성해 줬다. todays를. 을 기준으로 나눠주면 year, month, day가 나온다. 이 값들을 정수형으로 변환시킨 뒤 todayAll에 한 달을 28일 기준으로 잡고 계산을 해서 더해줬다. 이렇게 하면 현재 날짜가 값으로 환산된다. 그 뒤 forEach문을 사용해서 terms를 문자와 숫자로 나눠서 map에 넣어줬다. 그 뒤 for문을 사용해서 privacies의 길이만큼 반복문을 실행해 준다. privaciesAll에 은 공백을 기준으로 나눠서 날짜와 문자가 길이가 2인 배열로 생성될 것이다. 첫 번째 배열에 들어있는 날짜들을 위와 같은 방법으로 똑같이 year, month, day로 구분해 준 뒤 값을 더했다. 그 뒤 if문을 사용해서 아까 나눈 문자가 갖고 있는 값을 map에서 찾아와 *28을 해준 뒤 pTodayAll에 대입해 줬다. 이렇게 하면 pTodayAll을 소멸시켜야 하는 값이 나올 것이다. 마지막으로 비교를 해줬다. todayAll이 pTodayAll보다 크거나 같다면 유효기간이 지났다는 걸 뜻하니 list에 넣어줬다. 마지막으로 answer에 list의 값을 넣어주고 반환했다.

 

처음에 코드를 작성할 때 마지막 부분에 존재하는  if(todayAll >= pTodayAll)의 기호를 if(todayAll < pTodayAll)로 사용했다. 그런데 값이 자꾸 반대로 나와서 왜 그럴까? 하면서 year, month, day, add 값들을 출력해 가며 계산해 봤다. 계산해본결과 나의 착각이었다. pTodayAll이 todayAll보다 크다고 폐기를 하는 것을 틀렸기 때문이다. pTodayAll은 개인정보의 유효기간이다. 따라서 todayAll이 pTodayAll보다 크지 않다면 아직 유효기간이 지나지 않은 것이므로 폐기처리 할 이유가 없다. 그래도 의문을 금방 해결해서 다행이라고 생각됐던 문제다.

 

 

 

 

70. 둘만의 암호

문제

class Solution {
    public String solution(String s, String skip, int index) {
        String answer = "";
        
        for(int i=0; i<s.length(); i++){
            char ch = s.charAt(i);
            
            for(int j=0; j<index; j++){
                ch++;
                
                if(ch > 'z'){
                    ch -= 26;
                }
                if(skip.contains(String.valueOf(ch))){
                    j--;
                }
            }
            answer += ch;
        }
        
        return answer;
    }
}

<작성한 코드>

s의 길이만큼 for문을 반복시켰다. char형 변수 ch에는 s의 각 문자들을 차례로 넣어줬고, 내부에서는 for문을 하나 더 사용해서 j만큼 ch를 1씩 늘려줬다. 이때 ch가 z보다 커진다면 a로 돌아가야 하기  때문에 이경우에는 ch에서 -26을 해줬고, 만약 ch를 문자열로 변환한 값이 skip에 포함된다면 j를 1 빼줘서 ch에 1을 한번 더 더하도록 한다. 만약 skip에 포함된 단어가 3번이 나온다면 ch의 값이 3번 증가하게 될 것이다. 그 뒤 answer에 ch를 추가해 주고 answer을 반환하였다.

 

 

 

 

 

71. 카드 뭉치

문제

class Solution {
    public String solution(String[] cards1, String[] cards2, String[] goal) {
        int cardsIndex1 = 0;
        int cardsIndex2 = 0;
        
        for(String str : goal){
            if(cardsIndex1 < cards1.length && str.equals(cards1[cardsIndex1])){
                cardsIndex1++;
            } else if(cardsIndex2 < cards2.length && str.equals(cards2[cardsIndex2])){
                cardsIndex2++;
            } else{
                return "No";
            }
        }
        
        return "Yes";
    }
}

<작성한 코드>

코드를 간단히 작성한것처럼 보이지만 방법을 생각하는 데는 꽤 시간이 걸렸던 문제다. cards1과 cards2의 인덱스로 사용할 정수형 변수 두 개를 만들어 줬다. 그 뒤 goal의 원소를 하나씩 비교해 줬다. 만약 cardsIndex1이 cards1의 길이보다 작고 goal의 차례대로 들어올 원소가 cards1에 있다면 cardsIndex1을 1 증가시켰다. 여기에 포함되지 않고 cards2에 포함되어 있다면 마찬가지로 cardsIndex2에 증가시켰다. 차례 대로 증가시키다가 cards1, cards2 두 개의 배열에 둘 다 포함되지 않는 goal의 문자열이 나온다면 No를 리턴했다. 만약 리턴이 안되었다면 만들 수 있다는 것이기에 마지막에 Yes를 리턴해줬다.

반응형
프로필사진

남건욱's 공부기록