28일차 - 컬렉션 프레임 워크 - Map컬렉션 Quiz(2)
안녕하세요. pitang입니다.
프로그래머스와 리트코드에 있는 문제들을 Map컬렉션을 이용해 풀어보았습니다.
Junit으로 메서드를 검증하여 오류가 없으면 정답인 퀴즈들입니다!
Quiz 11번
프로그래머스 완주하지 못한 선수 문제입니다.
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때,
완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.
마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
c(completion)의 길이는 p(participant)의 길이보다 1 작고 참가자의 이름은 알파벳 소문자로 이루어져 있습니다.
참가자 중에는 동명이인이 있을 수 있습니다.
아래의 junit으로 오류를 확인하세요.
class Ex11Programmers42576Test { @Test void test() { Ex11Programmers42576 e = new Ex11Programmers42576(); assertEquals("leo", e.solution(new String[] {"leo", "kiki", "eden"}, new String[] {"eden", "kiki"})); assertEquals("vinko", e.solution(new String[] {"marina", "josipa", "nikola", "vinko", "filipa"}, new String[] {"josipa", "filipa", "marina", "nikola"})); assertEquals("mislav", e.solution(new String[] {"mislav", "stanko", "mislav", "ana"}, new String[] {"stanko", "ana", "mislav"})); assertEquals("mislav", e.solution(new String[] {"mislav", "stanko", "stanko", "mislav", "ana"}, new String[] {"stanko", "stanko", "ana", "mislav"})); } }
⬇️⬇️⬇️ 정답은 더보기를 눌러주세요 ⬇️⬇️⬇️
public class Ex11Programmers42576 { public String solution(String[] p, String[] c) { Map<String, Integer> map = new HashMap<>(); //완주자 목록 작성 for(String name : c) { if(map.containsKey(name)) { map.put(name, map.get(name) + 1); } else { map.put(name, 1); } } //참가자 확인 for(String name : p) { if(!map.containsKey(name)) { return name; } else { if(map.get(name) == 0) { return name; } map.put(name, map.get(name) - 1); } } return null; } }
Quiz 12번
리트코드 1번 Two Sum 문제입니다.
정수 숫자와 정수 대상의 배열이 주어지면 두 숫자의 인덱스를 대상에 더하도록 반환합니다.각 입력에 정확히 하나의 솔루션이 있다고 가정할 수 있으며 동일한 요소를 두 번 사용하지 않을 수도 있습니다.어떤 순서로든 답변을 반환할 수 있습니다.ex) [1, 2, 5], 7 -> 인덱스(1, 2)를 리턴
아래의 junit으로 오류를 확인하세요.
class Ex12LeetCode1Test { @Test void test() { Ex12LeetCode1 e = new Ex12LeetCode1(); int[] ret1 = e.twoSum(new int[] { 2, 7, 11, 15 }, 9); assertEquals(2, ret1.length); Arrays.sort(ret1); assertEquals(0, ret1[0]); assertEquals(1, ret1[1]); int[] ret2 = e.twoSum(new int[] { 3, 2, 4 }, 6); assertEquals(2, ret2.length); Arrays.sort(ret2); assertEquals(1, ret2[0]); assertEquals(2, ret2[1]); int[] ret3 = e.twoSum(new int[] { 3, 3 }, 6); assertEquals(2, ret3.length); Arrays.sort(ret3); assertEquals(0, ret3[0]); assertEquals(1, ret3[1]); int[] ret4 = e.twoSum(new int[] { 3, 2, 3 }, 6); assertEquals(2, ret4.length); Arrays.sort(ret4); assertEquals(0, ret4[0]); assertEquals(2, ret4[1]); } }
⬇️⬇️⬇️ 정답은 더보기를 눌러주세요 ⬇️⬇️⬇️
public class Ex12LeetCode1 { public int[] twoSum(int[] nums, int target) { Map<Integer, Integer> map = new HashMap<>(); for(int i = 0; i < nums.length; i++) { int diff = target - nums[i]; if(map.containsKey(diff) { return new int[] {map.get(diff), i}; } map.put(nums[i], i); } return null; } }
Quiz 13번
리트코드 387번 First Unique Character in a String 문제입니다.
문자열 s가 주어지면 문자열에서 첫 번째 반복되지 않는 문자를 찾아 인덱스를 반환합니다.
존재하지 않는다면 -1을 반환합니다.
ex) leetcode -> l을 리턴
아래의 junit으로 오류를 확인하세요.
class Ex13LeetCode387Test { @Test void test() { Ex13LeetCode387 e = new Ex13LeetCode387(); assertEquals(0, e.firstUniqChar("leetcode")); assertEquals(2, e.firstUniqChar("loveleetcode")); assertEquals(-1, e.firstUniqChar("aabb")); } }
⬇️⬇️⬇️ 정답은 더보기를 눌러주세요 ⬇️⬇️⬇️
public class Ex13LeetCode387 { public int firstUniqChar(String s) { Map<Character, Integer> map = new HashMap<>(); //map에 일단 character와 Integer를 넣어주고 for(int i = 0; i < s.length(); i++) { Character c = s.charAt(i); if(map.containsKey(c)) { map.put(c, map.get(c) + 1); } else { map.put(c, 1); } } //첫번째에 value가 1인 것을 리턴 for(int i = 0; i < s.length(); i++) { if(map.get(s.charAt(i)) == 1) { return i; } } return -1; } }
Quiz 14번
리트코드 1512번 Number of Good Pairs 문제입니다.
정수 숫자의 배열이 주어지면 양호한 쌍의 수를 반환합니다.
nums[i] == nums[j] 및 i <j일 경우 쌍(i, j)을 양호하다고 합니다.
ex) [1, 2, 3, 1, 1, 3] -> (0,3), (0,4), (3,4), (2,5) 4 리턴
아래의 junit으로 오류를 확인하세요.
class Ex14LeetCode1512Test { @Test void test() { Ex14LeetCode1512 e = new Ex14LeetCode1512(); assertEquals(4, e.numIdenticalPairs(new int[] { 1, 2, 3, 1, 1, 3 })); assertEquals(6, e.numIdenticalPairs(new int[] { 1, 1, 1, 1 })); assertEquals(0, e.numIdenticalPairs(new int[] { 1, 2, 3 })); } }
⬇️⬇️⬇️ 정답은 더보기를 눌러주세요 ⬇️⬇️⬇️
public class Ex14LeetCode1512 { public int numIdenticalPairs(int[] nums) { Map<Integer, Integer> map = new HashMap<>(); for(int num : nums) { if(map.containsKey(num)) { //key가 있으면 value +1 로 덮어쓰기 map.computeIfPresent(num, (k,v) -> v+1); } else { map.put(num, 1); } } int result = 0; //여기가 아직 이해가 되지 않았다,, 나중에 설명을 첨언해야지 for(Map.Entry<Integer, Integer> entry : map.entrySet()) { int val = entry.getValue(); int sum = (val) * (val-1)/2; result += sum; } return result; } }
감사합니다.
*m1 맥북을 사용 중입니다.*