[프로그래머스] Lv.1 달리기 경주 JAVA 풀이
문제 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
* 독학으로 익히는 코딩이라 틀린 것이 있을 수 있습니다. 오류가 있다면 댓글을 통해 알려주세요. 감사합니다. *