OddOccurrencesInArray
HashMap을 이용한 문제 풀이
블로그를 만들어놨는데 한동안 포스팅이 없었다.
뭘 포스팅할지 결정하는걸 자체를 미루기도 했었지만
포스팅을 하다가도 애초에 블로그를 만들었던 목적과는 다른 포스팅이 되는것 같아
글을 쓰다가 접어버린 경우도 꽤 있었다.
알고리즘 공부를 하면서 Codility라는 사이트를 알게 됐는데
내가 작성한 문제, 코드를 다시보는 기능이 없는것 같아
앞으로 잘 안풀려서 참고했던 코드나, 풀었는데 점수가 낮았던 경우들을 포스팅할려고 한다.
OddOccurrencesInArray 는 Array lesson2에 있는 문제인데
요약해서 이해해보자면,
int []A로 된 배열에 원소들중 짝을 이루지않고있는 원소를 찾는것이다.
내 풀이 과정은 이랬다.
1. A배열의 원소들을 비교해 같은 값을 가진 원소의 갯수를 B배열에 따로 만든다.
- ex) A={1,2,3,4,4,5} 이면 B배열에 원소마다 A배열의 원소가 가진 같은 원소의 갯수를 채워넣는 것이다.
2. B배열을 통해 짝이 없는 A배열의 원소 인덱스를 파악하고, 같은 인덱스의 A배열 인덱스를 반환한다.
풀이과정을 쓰려고 하니까 설명이 굉장히 어렵다 :(
import java.util.*;
class Solution {
public int solution(int[] A) {
// write your code in Java SE 8
int[] B = new int[A.length];
int count=0;
int even = 0;
for(int i =0 ; i<=A.length-1; i++)
{
count = 0;
for(int j = 0 ; j<=B.length-1; j++)
{
if(A[i] == A[j] && i!=j)
{
count++;
}
}
B[i] = count+1; //A[]배열에서 A[i]와 같은 값을 가진 원소의 갯수
if(B[i] == 1)
{
even = A[i];
}
}
return even;
}
}
문제를 풀어보고 다른분이 푼 풀이도 봤는데 (by speedpak)
HaspMap을 쓴 풀이 과정이 제일 깔끔하게 풀수있었던 방법이었던것 같다.
import java.util.HashMap;
import java.util.Map;
/**
* @author Deepak
*
*/
public class OddOccurrencesInArray {
public static int solution(int[] A) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < A.length; i++) {
if (map.containsKey(A[i])) {
map.put(A[i], map.get(A[i]) + 1);
} else {
map.put(A[i], 1);
}
}
Integer v = null;
for (Map.Entry<Integer, Integer> m : map.entrySet()) {
if (m.getValue() % 2 != 0) {
v = m.getKey();
break;
}
}
return v;
}
public static void main(String[] args) {
int[] ar = new int[] { 9, 3, 9, 3, 9, 7, 9 };
System.out.println(solution(ar));
}
}
HaspMap에 각 원소에 해당하는 갯수를 같이 put시켜놓으면 key와 value의 형태가
원소 : 갯수 이런형태로 만들어져 나머지 연산을 통해 짝이 없는 원소를 판별할수 있다.