본문 바로가기
Java/알고리즘

2차원배열을 HashMap으로 / [구현]보드게임

by 티코딩 2022. 11. 25.

7. 2차원 배열(배열을 요소로 갖는 배열)을 입력받아 각 배열을 이용해 만든 HashMap을 리턴해야 합니다.

내가작성한 코드

for(int i = 0; i < arr[i].length; i++){
for(int j = 0; j < 2; j++){
if(arr[i].length == 0){ }
else{
hashmap.put(arr[i][j],arr[i][j]);
}
}
}
return hashmap;
}
}

키에는 [0][0],[1][0],[2][0],[3][0], 값에는 [0][1],[1][1],[2][1] 이렇게 들어가니깐 put을 다시 설정 해줬다.

// 빈 해시맵 만든다. HashMap<String, String> hashmap = new HashMap<>();
HashMap<String, String> hashmap = new HashMap<>();
// 먼저 arr을 순회하는 반복문
for(int i = 0; i < arr[i].length; i++){
if(arr[i].length == 0){ }
else{
hashmap.put(arr[i][0],arr[i][1]);
}
}
return hashmap;
}
}
오류가
expected: {"first"="second", "melee"="brawl", "some"="like"} but was: {"first"="second", "some"="like"}

이렇게 나왔다. 왜지? melee, brawl 은 각각 arr[1][0], arr[1][1]인데 왜 사라졌을까. 혹시나 순서가 저장이 되지 않은건가 싶었다.

그래서 저번에 블로그에 적었던 순서가 그대로 저장되는 LinkedHashMap이 생각났다. (후에 알았지만 순서는 상관없다고한다..)

HashMap<String, String> hashmap = new LinkedHashMap<>();
// 먼저 arr을 순회하는 반복문
for(int i = 0; i < arr[i].length; i++){
if(arr[i].length == 0) {}
if(arr)
else{
hashmap.put(arr[i][0],arr[i][1]);
}
}
return hashmap;
}
}

인텔리제이에서 다시 해봤다.

String[][]arr = new String[][]{{"some", "like"}, {"first","second"},{"melee", "brawl"}};
        HashMap<String, String> hashmap = new LinkedHashMap<>();
        for(int i = 0; i < arr.length; i++){
            if(arr[i].length == 0) {}
            else{
                hashmap.put(arr[i][0],arr[i][1]);
            }
        }
        System.out.println(hashmap);
    }
}

반복문에서 arr[i].length를 arr.length로 하니 테스트를 좀더 통과했다. 하지만 여기서 통과하지 못한부분이 키가 중복될 경우, 앞에있는 키를 사용한다는 것이었는데, 내 코드에서는 뒤에있는걸 사용했다.

remove()로 키값이 같으면 삭제해야하는로직을 넣어야 하나? 아니면 배열상태일때 미리 삭제를 해야하나?

배열 상태에서 삭제하려고 했는데 배열에서 삭제하려면 저장공간을 다시 설정해주고 새 배열을 만들어서 거기다가 넣는 과정을 거쳐야해서 다른 방법을 생각해봤다. 정말 거의 하루종일 생각해봤는데 도저히 답이 없어서 레퍼런스 코드를 봤다.

 HashMap<String, String> hashmap = new LinkedHashMap<>();
        for(int i = 0; i < arr.length; i++){
            if(arr[i].length == 0) {}
            if(arr[i].length != 0){
                if(!hashmap.containsKey(arr[i][0])){
                    hashmap.put(arr[i][0],arr[i][1]);
                }
            }
        }
        System.out.println(hashmap);
    }
}

if(!hashmap.containsKey(arr[i][0])) 이 코드가 없어서 안됐던 것이었다. 

containsKey(Object Key) == 주어진 키가 있으면 true, 없으면 false를 리턴함.

즉, arr[0~arr의길이][0] 가 없으면, hashmap에 put 한다.

 

 

알고리즘 3번

보드판이 담긴 board와 조작하려고 하는 문자열 operation이 주어질 때, 말이 해당 칸을 지나가면서 획득한 숫자의 합을 구하는 함수를 작성하세요.

-실패를 겪은 코드-

public class Solution {
public Integer boardGame(int[][] board1, String operation) {
int result = 0;
int k = 0;
int v = 0;
for(int i = 0; i < operation.length();i++){ //operation 순회함.
switch (String.valueOf(operation.charAt(0))) {
case "U":
case "L":
System.out.println();//null값 반환

break;
}
if(String.valueOf(operation.charAt(i)).equals("D")){
k++;
result += board1[k][v];

}else if(String.valueOf(operation.charAt(i)).equals("U")){
k--;
result += board1[k][v];

}else if(String.valueOf(operation.charAt(i)).equals("R")) {
v++;
result += board1[k][v];

}else if(String.valueOf(operation.charAt(i)).equals("L")) {
v--;
result += board1[k][v];

}else if(k > board1.length){
return null;
}else if(v > board1[0].length){
return null;
}
 
}
return result;
}
}

k나 v가 범위를 넘어설 때, null 값을 반환해야하는데 그게 안됐다. 예외 처리를 해야하나?

public class Main {
    public static void main(String[] args) {
        int[][] board1 = new int[][]{
                {0, 0, 0, 1},
                {1, 1, 1, 0},
                {1, 1, 0, 0},
                {0, 0, 0, 0}
        };
        String operation = "RRRR";
        int result = 0;
        int k = 0; //arr[k][]
        int v = 0; //arr[][v]
        try {   //예외처리
            for (int i = 0; i < operation.length(); i++) { //operation 순회함.
                switch (String.valueOf(operation.charAt(i))) {
                    case "D":
                        k++;
                        result += board1[k][v];

                        break;
                    case "U":
                        k--;
                        result += board1[k][v];

                        break;
                    case "R":
                        v++;
                        result += board1[k][v];

                        break;
                    case "L":
                        v--;
                        result += board1[k][v];

                        break;
                }
            }
        }
        catch (ArrayIndexOutOfBoundsException e){
            System.out.println("예외처리!");
        }
        System.out.println(result);
    }
}

 예외처리를 하고 finally 를작성했다가 안돼서 지우고 바로 return result했더니 모든 테스트를 통과했다.

뿌-듯