본문 바로가기
Programmers/Lv.1

[프로그래머스] Lv.1 달리기 경주 JAVA 풀이

by Poorm 푸름 2023. 8. 21.

문제 Lv.1 달리기 경주

:  players는 현재 달리고 있는 순서대로 선수들의 이름 (문자열 배열)

   callings는 해설진이 부르는 추월한 선수 이름 (문자열 배열)

 

:  어떤 선수가 자신의 바로 앞 선수를 추월할 때 해설진은 추월한 선수의 이름을 부른다

   (한칸 추월 = 서로 순위만 변경)

 

 (예시) 

   players
   [ 철수 - 짱구 - 유리 - 맹구 - 훈이 ] 순으로 달리고 있다

   callings
   [ 맹구, 맹구, 짱구, 훈이 ] 라면

 
   과정 1) 해설진이 맹구 언급 = [ 철수 - 짱구 - 맹구 - 유리 - 훈이 ] 순으로 변경

   과정 2) 해설진이 맹구 언급 = [ 철수 - 맹구 - 짱구 - 유리 - 훈이 ] 순으로 변경

   과정 3) 해설진이 짱구 언급 = [ 철수 - 짱구 - 맹구 - 유리 - 훈이 ] 순으로 변경

   과정 4) 해설진이 훈이 언급 = [ 철수 - 짱구 - 맹구 - 훈이 - 유리 ] 순으로 변경

   최종 결과
   [ 철수 - 짱구 - 맹구 - 훈이 - 유리 ] 순으로 달리고 있다

 

<Map>

:  키(Key)와 값(Value) 두 쌍으로 데이터를 보관하는 자료구조
:  키는 맵에 오직 유일하다(같은 맵에 중복 X)

   값(value)은 중복돼도 OK

 

<HashMap>

 

:  해싱된 맵

:  비슷하게는 Hashtable이 있다

   두 개의 차이점  -  Thread 관점에서의 안전한 것은 Hashtable

                             -  안전하지는 않지만 속도가 빠른 HashMap



  1) 맵 선언

  :  Map<타입, 타입> 변수명 = new HashMap<>();

     (ex) Map<String,Integer> m = new HashMap<>();

 

  :  앞에는 Map, 뒤에는 HashMap 을 쓴 이유는 Map이 인터 페이스이기 때문이다

     (인터페이스는 선언만 가능, 객체 생성은 불가능)

      때문에 자식인 HashMap으로 객체를 생성한다.

     (HashMap은 부모인 Map의 메소드들을 강제 상속받음)

 

  2) 맵에 데이터 저장


  :  변수명.put("Key", "Value");

     (ex) m.put("홍길동", "1")

     * 이때 만약 같은 키에 다른 값을 또 저장한다면 맨 마지막 데이터가 덮어쓴다

 

  3) 저장된 데이터 출력

 

     (ex)  m.put("철수", "1")

              m.put("영희", "2")

      -  전체 Key 출력 : System.out.println(변수명.keySet()); → (ex) 출력 : 철수, 영희 

      -  전체 Value 출력 : System.out.println(변수명.Values()); → (ex) 출력 : 1, 2

      -  전체 Key,Value 출력 : System.out.println(변수명); → (ex) 출력 : 철수=1, 영희=2

      -  원하는 Key의 값만 출력 : System.out.println(변수명.get("철수")); → (ex) 출력 : 1

 

  4) 데이터 삭제


  :  변수명.remove("Key"); 
  :  변수명.clear(); 모든 키의 값 삭제       

 

  5) 데이터 수정

  :  변수명.put("Key", "Value"); 덮어씌기

  :  변수명.replace("Key", "Value"); 수정하기

 [코드]

import java.util.*;
import java.io.*;

class Solution {
    public String[] solution(String[] players, String[] callings) {
        Map<String, Integer> m = new HashMap<>();
        
        for(int i = 0; i<players.length;i++){
            m.put(players[i],i); //현 순위
        }
        
        for(String call : callings){
            int lank = m.get(call);
            m.put(call, lank-1);
            m.put(players[lank - 1], lank);
            players[lank] = players[lank - 1]; 
            players[lank - 1] = call;  
        }
        return players; 
    }
}


:  public String[] solution(String[] players, String[] callings)  메서드 안에서 사용할 매개변수 선언
       

:  Map<String, Integer> m = new HashMap<>();  맵 m을 선언 (Key = 선수이름, Value = 등수)
        
:  for(int i = 0; i<players.length;i++){  players는 배열이므로 length 뒤에 () 괄호를 붙이지 않는다

         m.put(players[i],i);  현재 달리고 있는 순서대로 선수이름과 등수를 맵에 넣는다
   }
        
:  for(String call : callings){  callings을 call에 넣는다 (즉 해설자가 부른 이름을 call에 저장)
        int lank = m.get(call);  맵 안의 call 값 가져오고 lank에 저장
                                           (즉 해설자가 부른 이름의 현등수를 lank의 저장)
        m.put(call, lank-1);  (맵에 추가) 해설자가 부른 선수이름을 찾아 그 등수를 -1 만큼 앞으로 땡겨준다

        m.put(players[lank - 1], lank);  (맵에 추가) 기존에 있던 (아까 땡긴 그자리 원래 주인) 선수는 

                                                                           위에서 해설자가 부른 선수의 원래 등수로 변경

 

        players[lank] = players[lank - 1];  선수의 현등수가 순서만 한 칸 앞당겨지고 (=추월)

        players[lank - 1] = call;  앞 당겨진 선수는 해설진이 부른 선수다   
   }

 

:  return players;  최종 선수들 호출  

 

 

 

https://school.programmers.co.kr/learn/courses/30/lessons/178871

        

 

프로그래머스

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

programmers.co.kr

 

 

* 독학으로 익히는 코딩이라 틀린 것이 있을 수 있습니다. 오류가 있다면 댓글을 통해 알려주세요. 감사합니다. *