쵼쥬
쵼쥬의 개발공부 TIL
쵼쥬
전체 방문자
오늘
어제
  • 분류 전체보기 (276)
    • 코딩테스트 (192)
      • [알고리즘] 알고리즘 정리 (7)
      • [백준] 코딩테스트 연습 (126)
      • [프로그래머스] 코딩테스트 연습 (59)
    • Spring (71)
      • [인프런] 스프링 핵심 원리- 기본편 (9)
      • [인프런] 스프링 MVC 1 (6)
      • [인프런] 스프링 MVC 2 (4)
      • [인프런] 실전! 스프링 부트와 JPA 활용1 (7)
      • [인프런] 실전! 스프링 부트와 JPA 활용2 (5)
      • [인프런] 실전! 스프링 데이터 JPA (7)
      • [인프런] 실전! Querydsl (7)
      • JWT (5)
      • [인프런] Spring Cloud (17)
      • [인프런] Spring Batch (4)
    • Java (6)
      • [Java8] 모던인자바액션 (4)
      • [부스트코스] 웹 백엔드 (2)
      • [패스트캠퍼스] JAVA STREAM (0)
    • CS (6)
      • 디자인 패턴과 프로그래밍 패터다임 (2)
      • 네트워크 (4)

블로그 메뉴

  • 홈

공지사항

인기 글

태그

  • spring
  • 스프링
  • 부스트코스
  • 위클리 챌린지
  • 타임리프
  • 백분
  • Spring Data JPA
  • jpa
  • 코딩테스트
  • 인프런
  • 백준
  • 누적합
  • 자바
  • MVC
  • 프로그래머스
  • 알고리즘
  • querydsl
  • 비트마스킹
  • 구현
  • BFS

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
쵼쥬

쵼쥬의 개발공부 TIL

코딩테스트/[프로그래머스] 코딩테스트 연습

완주하지 못한 선수

2021. 7. 8. 21:44

문제 설명

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

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

제한사항

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

 

입출력 예

participant completion return
["leo", "kiki", "eden"] ["eden", "kiki"] "leo"
["marina", "josipa", "nikola", "vinko", "filipa"] ["josipa", "filipa", "marina", "nikola"] "vinko"
["mislav", "stanko", "mislav", "ana"] ["stanko", "ana", "mislav"] "mislav"

 

입출력 예 설명

예제 #1
"leo"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.

 

예제 #2
"vinko"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.

 

예제 #3
"mislav"는 참여자 명단에는 두 명이 있지만, 완주자 명단에는 한 명밖에 없기 때문에 한명은 완주하지 못했습니다.

 


 

푸는 방법 생각

문제를 보고 HashMap을 이용해 참가자를 key값으로 두고 동명이인 수를 value로 나타내야 될 것 같았다. 

우선 HashMap을 참가자 수에 맞춰서 저장하고 완주자를 하나씩 제거하는 방법으로 구현했다.

마지막 남은 참가자 이름을 return 해줬다.

 

내 코드

import java.util.HashMap;
import java.util.Iterator;

class Solution {
 public String solution(String[] participant, String[] completion) {
      String answer = "";
        HashMap<String, Integer> map = new HashMap<String, Integer>();

        for (int i = 0; i < participant.length; i++) {
            if (map.containsKey(participant[i])) {
                map.put(participant[i], map.get(participant[i]) + 1);
            } else {
                map.put(participant[i], 1);
            }
        }

        for (int i = 0; i < completion.length; i++) {
            if (map.get(completion[i]) == 1) {
                map.remove(completion[i]);
            } else {
                map.put(completion[i], map.get(completion[i]) - 1);
            }
        }

        Iterator<String> it = map.keySet().iterator();
        while(it.hasNext()){
            answer = it.next();
        }

        return answer;
    
    }
}

 

다른 사람 풀이

import java.util.HashMap;

class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        HashMap<String, Integer> hm = new HashMap<>();
        for (String player : participant) hm.put(player, hm.getOrDefault(player, 0) + 1);
        for (String player : completion) hm.put(player, hm.get(player) - 1);

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

 

나는 HashMap의 get을 이용해서 하나씩 중복을 확인하여 구현했지만 다른 사람들의 풀이에서 getOrDefault 메소드를 사용하여 중복이면 Default 값을 사용하도록 하여 효율성이 더 좋았다. 

for문은 향상된 for문을 사용하여 불필요한 코드를 없애고 Iterator도 사용하지 않았다. 

쉬운 문제지만 좀 더 생각해 볼 필요가 있다.

'코딩테스트 > [프로그래머스] 코딩테스트 연습' 카테고리의 다른 글

H-Index  (0) 2021.07.12
가장 큰 수  (0) 2021.07.12
K번째수  (0) 2021.07.09
위장  (0) 2021.07.09
전화번호 목록  (0) 2021.07.09
    '코딩테스트/[프로그래머스] 코딩테스트 연습' 카테고리의 다른 글
    • 가장 큰 수
    • K번째수
    • 위장
    • 전화번호 목록
    쵼쥬
    쵼쥬

    티스토리툴바