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

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

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

 

----------------------------------------

 

public String solution(String[] participant, String[] completion) {
  // TODO Auto-generated method stub
  String rtn_val = "";

  ArrayList p1 = new ArrayList<>();
  ArrayList c1 = new ArrayList<>();

  for (int i =0 ; i<participant.length ; i++) {
    p1.add(participant[i]);
    if (i < participant.length-1) { //c1 이 1 개 작다
      c1.add(completion[i]);
    }
  }

//p1.retainAll(c1); // p1 에서 c1과 겹치는 부분만 남기고 나머지 삭제


// p1 에서 c1 에 포함된 객체를 삭제한다
// for(int i= p1.size()-1; i >= 0; i--) {
// if(c1.contains(p1.get(i)))
// p1.remove(i);
// }

//rtn_val = p1.toString();

/*
[1] : [leo]
[2] : [vinko]
[3] : []

3번 경우 [3] : mislav 가 나와야 함
이 방식은 중복도 함께 지워버림
*/

// Arrays.sort(participant);
// Arrays.sort(completion);
//
// for (int i=0 ; i<completion.length ; i++) {
//
// if ( !(completion[i].equals(participant[i] ) ) ) {
// rtn_val = participant[i];
// break;
// }
//
// if ("".equals( rtn_val )) {
// rtn_val = participant[participant.length-1];
// }
// }


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

  for (String player : participant) {
    //hm.put(player, hm.get(player) + 1);
    hm.put(player, hm.getOrDefault(player, 0) + 1);
  }
  for (String player : completion) {
    hm.put(player, hm.get(player) - 1);
  }

  System.out.println(hm);
  return rtn_val;
}

 

----------------------------------------

 

getOrDefault : key값이 없다면 입력시 설정한 default 값 반환

 

HashMap<String , String> map = new HashMap<String, String>();

String val = map.getOrDefault("key","val");

//HashMap 을 바로 생성하고 "key"라는 값을 바로 불러왔는데요.

// "key"로 저장된 값이 없기 때문에 디폴트로 "val"이라는 값이 val변수에 저장됩니다.

 

putIfAbsent : key 값이 없다면 입력된 key 와 value를 입력 , 해당 key 가 존재하면 입력되었던 값 반환

HashMap<String , String> map = new HashMap<String, String>();

map.putIfAbsent("key","val");

// 위의 코드는 null을 반환합니다.

// 다시 putIfAbsent()를 사용하면

map.putIfAbsent("key","val_new");

//이때는 이전에 입력한 "val"이 반환되고 다시 "key" 값의 밸류값은 "val_new"로 변경됩니다.

//이후에 "key"에대한 값은 "val_new"됩니다.

 

----------------------------------------

----------------------------------------

(인터넷 검색/펌 포함)

sort, hm

[1]

참여자명단과 완주자명단 비교 
-> hashtable ht 에 key 와 cnt 를 넣을 의도

동명이인 처리
-> 참가자를 (중첩)루핑 돌면서 동일인 : cnt=2 로

-> ht 가 > 0 이상이면 동일인 이 있다고 판단
완주자 명단 검사 -> cnt 가 안 맞으면 이게 정답

그 다음은 루핑 돌면서 검사
참여자 명단에 있는데 완주자 명단에 없으면 이게 정답

--------------------------------------------------
[2]

참여자명단과 완주자명단 -> sort 함

완주자 명단이 하나 적음
참여자 명단으로 for loop (참여자 명단의 마지막-1 까지만 루핑)
-> 다른 경우 정답

모두 동일한 경우 마지막이 정답

??
완주자로 for loop 돌아도 될 듯

--------------------------------------------------
[3]

1번이랑 비슷

참여자명단 loop 돌아 hm 에 key (이름) , value(1) 을 넣는다
완주자명단 돌면서 -1 해준다

마지막으로 hm loop 돌면서
value 가 1인거 찾는다


--------------------------------------------------
[4]

2번이랑 비슷

완주자로 for loop 돌아도 될 듯 -> 실제로 해봄

'프로그래밍언어' 카테고리의 다른 글

K번째수  (0) 2019.08.30
체육복  (0) 2019.08.30
모의고사  (0) 2019.08.30
HashMap 처리  (0) 2019.07.29
Arrays.asList() - 사용 시 주의  (0) 2019.07.29

+ Recent posts