23년 5월 2일 [알고리즘 - 자료구조]

sua·2023년 5월 1일
0

알고리즘 가보자고

목록 보기
14/101

프로그래머스 폰켓몬

문제


나의 풀이

import java.util.*;

class Solution {
    public int solution(int[] nums) {
        int answer = 0;
        
        HashSet<Integer> set = new HashSet<>();
        for(int num : nums) {
            set.add(num);
        }
        
        int n = nums.length / 2;
        if(set.size() > n) { // 가질 수 있는 폰켓몬 수 보다 많은 경우
            answer = n; // 가장 많은 종류의 수는 가질 수 있는 폰켓몬 수가 된다.
        } else { // 작은 경우
            answer = set.size(); // 종류의 수는 set의 size와 같다.  
        }
        
        return answer;
    }
}

폰켓몬을 종류 중복 없이 저장할 HashSet을 생성한다. 그런 다음 이 set에 폰켓몬의 종류들의 배열의 요소를 추가시킨다. 그렇게 되면 중복 없이 폰켓몬 종류만 남게 된다.
가질 수 있는 폰켓몬 수 보다 이 set의 크기가 큰 경우는 가장 많은 종류의 수는 가질 수 있는 폰켓몬 수가 된다. 아무리 set이 크더라도 가질 수 있는 개수는 한정되어 있기 때문이다.
set의 크기가 작은 경우에는 가질 수 있는 폰켓몬 수가 종류의 수가 되지 못하고 현재 가지고 있는 set의 크기만큼만 가능하다.

결과



프로그래머스 완주하지 못한 선수

문제

나의 풀이

import java.util.*;

class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        
        HashMap<String, Integer> map = new HashMap<>();
        for(String p : participant) {
            map.put(p, map.getOrDefault(p, 0) + 1);
        }
        for(String c : completion) {
            if(map.get(c) > 0) {
                map.put(c, map.get(c) - 1);
            }
            if(map.get(c) == 0) {
                map.remove(c);
            }
        }
        
        for(String key : map.keySet()) {
            answer = key;
        }
        
        return answer;
    }
}

참여자 + 완주자 명단을 관리하기 위해 HashMap을 생성한다. 그런 다음 참가자 명단인 participant에 대해 for문을 돌려서 참가자를 map에 추가시키고 map에 이미 존재하는 경우에는 동명이인으로 간주하여 값을 1을 증가시킨다.
그런 다음 완주자 명단인 completion에 대해 for문을 돌려서 완주자를 key로 해서 map에 검색한 뒤 값이 0보다 큰경우에는 그 값을 1 감소시킨다. 그리고 나서 값이 0인 경우는 map에서 제거시켜준다. 마지막으로는 map에 있는 key들을 for문을 돌려서 answer에 할당해준다. 이를 리턴해주면 된다.

결과



프로그래머스 전화번호 목록

문제

나의 풀이

import java.util.*;

class Solution {
    public boolean solution(String[] phone_book) {
        boolean answer = true;
        
        Arrays.sort(phone_book);
        for(int i = 0; i < phone_book.length - 1; i++) {
            if(phone_book[i + 1].startsWith(phone_book[i])) {
                answer = false;
            }
        }
        
        return answer;
    }
}

전화번호 목록을 오름차순으로 정렬하고 for문을 돌려서 i번째 전화번호가 i + 1번째 전화번호의 접두어인지 startsWith 메소드로 판별하고 해당하는 경우는 answer에 false를 할당해주면 된다.

결과


profile
가보자고

0개의 댓글