IT's 우

[Java] 프로그래머스 - 달리기 경주, HashMap 본문

알고리즘/프로그래머스

[Java] 프로그래머스 - 달리기 경주, HashMap

디우 2023. 7. 18. 17:36
728x90

📖 풀이한 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


 

💡 문제에서 사용된 알고리즘

  • HashMap

 

HashMap

HashMap의 선언

기본적으로 Map은 key:value 형태로 구성되어 있습니다. 

예를 들면, {국어=90점, 수학=80점}  각각의 과목이 key, 점수를 value라고 생각하면 됩니다.

그리고 key는 Set와 마찬가지로 중복이 불가능합니다.
먼저 선언하는 방법을 코드를 통해 설명하겠습니다.

HashMap<String,Integer> myMap=new HashMap<String, Integer>();

    System.out.println(myMap.toString());   //{}

 

HashMap의 주요 메서드

//1. put
    myMap.put("Korean", 90);
    myMap.put("Math", 80);
    myMap.put("English", 87);
    myMap.put("Science", 90);

    System.out.println(myMap.toString());   //{English=87, Science=90, Korean=90, Math=80}

    myMap.put("English", 95);

    System.out.println(myMap.toString());   //{English=95, Science=90, Korean=90, Math=80}

    //2. remove
    myMap.remove("English");

    System.out.println(myMap.toString());   //{Science=90, Korean=90, Math=80}

    //3. get
    System.out.println(myMap.get("Korean"));        //90

    //4. size
    System.out.println(myMap.size());       //3

    //5. contains
    System.out.println(myMap.containsKey("Math"));  //true
    System.out.println(myMap.containsKey("English"));   //false
    System.out.println(myMap.containsValue(90));    //true

    //6. keySet, Values
    System.out.println(myMap.keySet());             //[Science, Korean, Math]

    System.out.println(myMap.values());             //[90, 90, 80]

    //7. forEach
    for(String subject: myMap.keySet()) {
        System.out.println(subject);    //Science, ...
    }

 

put

Map 안에 값을 넣기 위해서 put을 사용합니다. 선언부에서 정의했던 자료형의 쌍을 집어넣게 되는데, HashSet에서처럼 작성한 코드의 순서와는 상관없이 값이 저장됩니다.
또한, 앞서 설명한듯이 key값은 중복이 불가능합니다. 

 

remove

 remove(key)

remove의 결과로 해당 key와 value가 모두 지워지게 됩니다.

 

get

get메서드 key를 사용하여 value를 호출하게 됩니다.

어차피 하나의 Map에는 중복되는 key가 존재하지 않으므로, 고유한 key는 하나의 value만을 가지게 됩니다.

 

size

size메서드는 Map의 크기를 int Type으로 반환하는 메서드입니다.

 

contains

이전의 다른 자료구조의 설명에서도 contains는 다룬 적이 많이 있습니다. 차이점이 있다면, Map의 key와 value에 각각 따로 containsKey containsValue라는 메서드가 구현되어 있다는 점입니다.

 

keySet, Values

keySet은 Map이 가지고 있는 key를, Values는 Map이 가지고 있는value를 각각 반환합니다. 특히 keySet은 다음에 설명할 forEach 문과 함께 자주 사용하는 메서드이므로 익숙해지는 것이 좋습니다.

 

forEach

keySet()의 결과인 key의 집합을 돌면서 수행하게 됩니다.

 

   for(String subject: myMap.keySet()) {
        System.out.println(subject+" : "+myMap.get(subject));   //Science : 90, ...
    }

 

📜 코드 설명

  • HashMap에 key : 선수이름, value: 선수 등수 인덱스를 넣어놓았다.
  • callings를 보면서 선수의 등수를 바꿔주었다.(map에 인덱스로 바꿔주고, players의 순서도 바꿔준다.)

📜 코드

import java.util.*;
public class 달리기경주 {
    public String[] solution(String[] players, String[] callings) {
        // HashMap에 선수들의 등수 넣기
        int len = players.length;
        HashMap<String, Integer> idx = new HashMap<>();

        for (int i = 0; i < len; i++) {
            idx.put(players[i], i);
        }

        // calling에서 불리면 현재 등수와 앞 등수의 인덱스 바꿔주기
        for (String call : callings) {
            // 불린 선수의 인덱스 map에서 찾기
            int index = idx.get(call);

            // players의 인덱스에 따라 순서 바꿔주고, map에서 인덱스 값도 바꿔준다.
            // 앞선수 인덱스 바꾸기
            String another = players[index - 1];
            idx.put(another, index);

            // 불린 선수 인덱스 -1로 바꾸기
            idx.put(call, index - 1);

            // players의 순서도 바꾸기
            players[index] = another;
            players[index - 1] = call;
        }

        return players;
    }
}

 

참고

https://wikidocs.net/122193

 

1.4.7 맵(Map) - HashMap

[TOC] ## 맵(Map) - HashMap 자료구조 단원의 마지막은 맵(Map)입니다. Map형태의 자료구조는 최근 가장 핫한 자료구조 중 하나입니다. 맵 리듀스(Map Re…

wikidocs.net

 

728x90
반응형