7. 2차원 배열(배열을 요소로 갖는 배열)을 입력받아 각 배열을 이용해 만든 HashMap을 리턴해야 합니다.
내가작성한 코드
키에는 [0][0],[1][0],[2][0],[3][0], 값에는 [0][1],[1][1],[2][1] 이렇게 들어가니깐 put을 다시 설정 해줬다.
expected: {"first"="second", "melee"="brawl", "some"="like"} but was: {"first"="second", "some"="like"}
이렇게 나왔다. 왜지? melee, brawl 은 각각 arr[1][0], arr[1][1]인데 왜 사라졌을까. 혹시나 순서가 저장이 되지 않은건가 싶었다.
그래서 저번에 블로그에 적었던 순서가 그대로 저장되는 LinkedHashMap이 생각났다. (후에 알았지만 순서는 상관없다고한다..)
인텔리제이에서 다시 해봤다.
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이 주어질 때, 말이 해당 칸을 지나가면서 획득한 숫자의 합을 구하는 함수를 작성하세요.
-실패를 겪은 코드-
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했더니 모든 테스트를 통과했다.
뿌-듯
'Java > 알고리즘' 카테고리의 다른 글
문자열배열 세로로 읽어버리기 (0) | 2022.12.05 |
---|---|
문자열사이에 '-' 삽입하자! (홀수사이에만!) (0) | 2022.11.26 |
문자열중 특정문자로 시작해 특정문자로 끝나는지 찾아용 (1) | 2022.11.25 |
안반잘다만 - String 슬라이싱 후 앞글자만 모으기 (0) | 2022.11.22 |
원금이 두배가 돼 두 두배 두배 (1) | 2022.11.19 |