뭉지(moonz)
작은 발자국들의 위대한 여정
뭉지(moonz)
  • All (202)
    • Test Code (4)
    • 백엔드 개발하며 작성한 (27)
      • Spring (17)
      • 데이터베이스 (7)
      • 기억할 내용 (3)
    • 언어 (53)
      • Java (25)
      • node.js (7)
      • Python (21)
    • 클라우드 (6)
    • Algorithm & Data Structure (51)
      • 개념 (15)
      • 문제 풀이 (36)
    • 유용한 모든 것 (16)
    • monologue (7)
      • 업무 노트 (1)
      • 관리 로그 (0)
      • 내 이야기 공책 (6)
    • Project (2)
    • TroubleShooting (8)
    • 지식 (18)
      • Machine Learning (6)
      • Review (7)
      • Web (5)
    • Computer Science (5)

블로그 메뉴

  • 홈
  • 태그

인기 글

최근 글

최근 댓글

전체 방문자
오늘
어제

티스토리

hELLO · Designed By 정상우.
뭉지(moonz)

작은 발자국들의 위대한 여정

[JAVA] 프로그래머스 - 완주하지 못한 선수 LV1
Algorithm & Data Structure/문제 풀이

[JAVA] 프로그래머스 - 완주하지 못한 선수 LV1

2022. 1. 24. 10:24
반응형

문제 이해 및 제한 사항

프로그래머스의 해시 문제, 완주하지 못한 선수 LV1

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

 

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

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

programmers.co.kr

입출력 예시

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

본 문제는 N명이 마라톤 경기에 참여하였지만 N-1명만 통과하고 통과되지 못한 1명을 찾는 문제입니다.

해쉬로 푸는 문제이니 해쉬로 풀어봐야겠습니다. 해쉬 외 방법으로의 풀이는 아래 링크를 참고하면 좋을 듯합니다.

 

문제 해결 순서

1. 해쉬의 KEY와 VALUE에 어떤 값을 넣어서 문제를 해결할지 고민한다.     가장 어려운 부분

  • INPUT으로 참가자(Participant)와 통과자(Completion) 배열이 들어온다.
  • 배열을 순환하면서 해쉬의 key에 참가자 이름을 넣고, value에 참가한 자(key)에 대해  +1을 해준다. (동명이인을 고려)

2. 통과자 배열을 돌면서 해쉬의 key에 있으면 value를 -1한다.

3. value가 0이 아닌 참가자는 통과자 배열에 없는 참가자일 것이므로 완주하지 못한 선수로 리턴한다.

 

코드

# 풀이 1. 4번째 문제 해결을 Iterator를 이용해서 푼다.  (더 높은 속도를 보여준다.)

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Iterator;

public class 해쉬_완주하지못한선수 {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        Map<String, Integer> map = new HashMap<>();
        Arrays.sort(participant);
        Arrays.sort(completion);

        // hashMap에 추가
        for (String p : participant) {
            map.put(p, map.getOrDefault(p, 0) + 1); // p가 key에 있으면 value를 가져옴. 없으면 디폴트 0
        }
        // 통과된 선수들 제거
        for (String c : completion) {
            map.put(c, map.get(c)-1);
        }
        // 순환하면서 0인 선수 return
        // Iterator가 더 속도높음
        Iterator<String> keys = map.keySet().iterator();
        while (keys.hasNext()) {
            String key = keys.next();
            if (map.get(key) != 0) {
                answer = key;
                break;
            }
        }

        return answer;
    }

    public static void main(String[] args) {
        해쉬_완주하지못한선수 k = new 해쉬_완주하지못한선수();

        String[] part = {"marina", "josipa", "nikola", "vinko", "filipa"};
        String[] comp = {"josipa", "filipa", "marina", "nikola"};

        String answer = k.solution(part, comp);
        System.out.println(answer);
    }
}

 

 

# 풀이 2. 4번째 문제 해결을 해쉬의 keySet을 이용한 반복문으로 푼다.

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

public class 해쉬_완주하지못한선수 {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        Map<String, Integer> map = new HashMap<>();
        Arrays.sort(participant);
        Arrays.sort(completion);

        // hashMap에 추가
        for (String p : participant) {
            map.put(p, map.getOrDefault(p, 0) + 1); // p가 key에 있으면 value를 가져옴. 없으면 디폴트 0
        }
        // 통과된 선수들 제거
        for (String c : completion) {
            map.put(c, map.get(c)-1);
        }
        // 순환하면서 0인 선수 return
        for (String key : map.keySet()) {
            if (map.get(key) != 0) {
                answer = key;
                break;
            }
        }
        return answer;
    }

    public static void main(String[] args) {
		// 생략
    }
}

 

 

참고글 : 자세한 설명이 나와있어 좋은 글입니다. 
해쉬 순회 방법 참고글
위 코드의 깃허브
 

해쉬_완주하지못한선수 · BananMoon/algorithm_study@b1a2542

Permalink This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository. Browse files 해쉬_완주하지못한선수 Loading branch information Showing 1 changed file with 17 additions and 1 deletion. +17

github.com

 

반응형
저작자표시 (새창열림)

'Algorithm & Data Structure > 문제 풀이' 카테고리의 다른 글

[JAVA] 프로그래머스 - 다트 게임 LV1  (0) 2022.04.01
[JAVA] 프로그래머스 - 전화번호 목록 LV2  (0) 2022.01.26
[프로그래머스] SQL 문제  (0) 2021.12.13
[JAVA] baekjoon 10871  (0) 2021.10.03
[JAVA] baekjoon 15552  (0) 2021.09.11
    'Algorithm & Data Structure/문제 풀이' 카테고리의 다른 글
    • [JAVA] 프로그래머스 - 다트 게임 LV1
    • [JAVA] 프로그래머스 - 전화번호 목록 LV2
    • [프로그래머스] SQL 문제
    • [JAVA] baekjoon 10871
    뭉지(moonz)
    뭉지(moonz)
    제가 깨달은 것을 정리하는 공간입니다. 🧡

    티스토리툴바