728x90

[문제]

https://programmers.co.kr/learn/courses/30/lessons/42586

 

코딩테스트 연습 - 기능개발

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는

programmers.co.kr

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다.

또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.

먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.

    제한 사항
    • 작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다.
    • 작업 진도는 100 미만의 자연수입니다.
    • 작업 속도는 100 이하의 자연수입니다.
    • 배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어집니다.

[문제 풀이]

Queue에 걸리는 시간을 계산해서 넣어준다.
걸리는 시간은 (100.0-progresses[i]/speeds[i])을 올림하면 된다.

그리고 while문을 돌면서 하나씩 뽑는데 그 다음것도 뽑을 수 있으면 뽑고 cnt 를 증가시킨다.
cnt를 하나씩 list에 넣어주고 list를 int[] array로 변환하여 return하면 된다.

[코드]

public boolean solution(String[] phone_book) {
        Queue<Integer> q = new LinkedList<>();
        for (int i=0; i<progresses.length; i++) {
            q.offer((int)Math.ceil((100.0-progresses[i])/speeds[i]));
        }

        List<Integer> answer = new ArrayList<>();
        while(!q.isEmpty()) {
            int cur = q.poll();
            int cnt = 1;

            while (!q.isEmpty() && cur >=q.peek()) {
                cnt++;
                q.poll();
            }
            answer.add(cnt);

        }
        return answer.stream().mapToInt(Integer::intValue).toArray();
}
728x90
728x90

[문제]

https://programmers.co.kr/learn/courses/30/lessons/42577

 

코딩테스트 연습 - 전화번호 목록

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다. 전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다. 구조

programmers.co.kr

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.
전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.

  • 구조대 : 119
  • 박준영 : 97 674 223
  • 지영석 : 11 9552 4421

전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.

제한 사항

  • phone_book의 길이는 1 이상 1,000,000 이하입니다.
    • 각 전화번호의 길이는 1 이상 20 이하입니다.
    • 같은 전화번호가 중복해서 들어있지 않습니다.

[문제 풀이]

Map에 전화번호를 하나씩 넣어주고 각 스트링을 스트링의 길이까지 하나씩 증가시키면서 쪼갰을 때 그 값을 키로 가지는것이 Map에 있으면 false를 출력하고 다 비교해도 없으면 true를 출력한다.

[코드]

public boolean solution(String[] phone_book) {
        int n = phone_book.length;

        Map<String, Integer> map = new HashMap<>();
        for (int i=0; i<n; i++) {
            map.put(phone_book[i], i);
        }
        
        for (int i=0; i<n; i++) {
            for (int j=0; j<phone_book[i].length(); j++) {
                String str = phone_book[i].substring(0, j);
                if (map.containsKey(str)) {
                    return false;
                }
            }
        }
        return true;
}

 

728x90
728x90

[문제]

링크: https://programmers.co.kr/learn/courses/30/lessons/42576

 

코딩테스트 연습 - 완주하지 못한 선수

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다. 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수

programmers.co.kr

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.

마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.

[제한사항]

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

[풀이]

위 문제 의도는 HashMap을 사용하여 문제를 해결하는 문제이다. 

그러나 배열만으로도 간단히 해결할 수 있기 때문에 두 가지 방법으로 풀어보았다.

1) 배열

public static String solution(String[] participant, String[] completion) {
    Arrays.sort(participant);
    Arrays.sort(completion);

    for (int i=0; i<completion.length; i++) {
        if (participant[i].equals(completion[i])) {
            continue;
        } else {
            return participant[i];
        }
    }

    return participant[participant.length-1];
}

각각 정렬을 하고 앞에서 부터 하나씩 비교를 한다.

동일하지 않으면 완주하지 못한 선수 이므로 출력해준다.

완주자 목록에 다른게 없다면 마지막 한 사람이므로 그 사람을 출력해준다.

2) HashMap

public static String solution(String[] participant, String[] completion) {
    String answer = "";

    Map<String, Integer> hm = new HashMap<>();
	
    for (String p : participant) {
        hm.put(p, hm.getOrDefault(p, 0)+1);
    }

    for (String c : completion) {
        hm.put(c, hm.get(c) - 1);
    }

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

    return answer;
}

먼저 참여자를 Map에 하나씩 넣고 1씩 증가시켜준다. (동명이인이 있으면 2, 3... 이렇게 숫자가 추가된다.)

완주자 목록을 하나씩 읽으며 저장된 맵의 value를 1씩 감소시킨다.

마지막으로 for문을 돌며 Map에 저장된 value 값이 0이 아닌 사람의 이름을 출력해 준다.

[결과]

1) 배열

2) HashMap

728x90
728x90

[문제]

https://programmers.co.kr/learn/courses/30/lessons/42578?language=java#

 

코딩테스트 연습 - 위장

 

programmers.co.kr

 

[문제 풀이]

- 얼굴: 동그란 안경, 검정 선글라스, none => 3가지의 경우의 수

- 상의: 파란색 티셔츠, none  => 2가지의 경우의 수

- 하의: 청바지, none => 2가지의 경우의 수

- 겉옷: 긴코트, none => 2가지의 경우의 수

 

총 3 * 2 * 2* 2 = 24가지가 나올 수 있다.

그런데 최소 한개의 옷을 입여야 하기 때문에 [none, none, none, none]을 고른 경우의 수 1개를 빼주어야 한다.

따라서 23가지

 

[코드]

public static int solution(String[][] clothes) {
  Map<String, Integer> hm = new HashMap<>();
  for (int i=0; i<clothes.length; i++) {
  	hm.put(clothes[i][1], hm.getOrDefault(clothes[i][1], 1) + 1);
  }
    
  int ans = 1;
  for (Integer value : hm.values()) {
  	ans *= value;
  }
  
  return ans-1;
}
728x90

+ Recent posts