[HackerRank] Cavity Map

아르당·2023년 12월 11일
0

HackerRank

목록 보기
43/109
post-thumbnail

문제를 이해하고 있다면 바로 풀이를 보면 됨
전체 코드로 바로 넘어가도 됨
마음대로 번역해서 오역이 있을 수 있음

문제

정수형 문자열의 행렬로 된 정사각형 지도가 있다. 지도의 각 칸은 깊이 값을 가지고 있다. 각 칸이 지도의 테두리에 없고 그 칸이 인접한 칸의 깊이가 작을 경우 그 칸을 지도의 구멍이라고 할 것이다. 두 칸은 공통된 측면 또는 가장자리가 있으면 인접한다.

지도에서 모든 구멍을 찾고, 해당 깊이를 대문자 X로 바꿔라.

Example

grid = ['989', '191', '111']

grid가 재배치 되어있다.

989
191
111

반환:

989
1X1
111

가운데 칸은 가장자리의 칸[8, 1, 1, 1]보다 깊다. 위쪽 두 모서리의 깊은 칸은 가운데 칸과 가장자리를 공유하지 않고 테두리 칸 중 어떤 것도 구멍이 되지 않는다.

Function Description

cavityMap 함수를 완성해라.
cavityMap 함수는 아래와 같은 매개변수를 가지고 있다.

  • String grid[n]: grid의 한 행을 나타낸 각 문자열

Returns

  • String{n}: 수정된 grid

Constraints

  • 1 <= n <= 100

풀이

타입을 쉽게 비교하기 위해 정수형 리스트로 변환했고, 이것을 다시 문자열 리스트로 변환한다.

먼저 매개변수 grid를 정수형 리스트로 바꾼다.

int length = grid.size();
List<List<Integer>> tempGrid = new ArrayList<>();

for(int i = 0; i < length; i++){
	List<Integer> temp = new ArrayList<>();

	for(int j = 0; j < length; j++){
		temp.add(Integer.valueOf(grid.get(i).charAt(j) - 48));
	}

	tempGrid.add(temp);
}

그리고 해당 칸의 값을 양 옆과 위아래 칸을 비교해서 구멍인지 확인하고 구멍이면 X로 치환한다.

List<String> result = new ArrayList<>();

for(int i = 0; i < tempGrid.size(); i++){
	StringBuilder temp = new StringBuilder();

	for(int j = 0; j < tempGrid.get(i).size(); j++){
		if(i == 0
        	|| j == 0
            || i == tempGrid.size() - 1
            || j == tempGrid.size() - 1
         ){
			temp.append(tempGrid.get(i).get(j));
			continue;
		}

		if(
        	tempGrid.get(i).get(j) > tempGrid.get(i - 1).get(j)
			&& tempGrid.get(i).get(j) > tempGrid.get(i + 1).get(j)
			&& tempGrid.get(i).get(j) > tempGrid.get(i).get(j - 1)
			&& tempGrid.get(i).get(j) > tempGrid.get(i).get(j + 1)
		){
			temp.append("X");
		}else{
			temp.append(tempGrid.get(i).get(j));
		}
	}

	result.add(temp.toString());
}

return result;

전체 코드

public static List<String> cavityMap(List<String> grid) {
	int length = grid.size();
	List<List<Integer>> tempGrid = new ArrayList<>();

	for(int i = 0; i < length; i++){
		List<Integer> temp = new ArrayList<>();

		for(int j = 0; j < length; j++){
			temp.add(Integer.valueOf(grid.get(i).charAt(j) - 48));
		}

		tempGrid.add(temp);
	}

	List<String> result = new ArrayList<>();

	for(int i = 0; i < tempGrid.size(); i++){
		StringBuilder temp = new StringBuilder();

		for(int j = 0; j < tempGrid.get(i).size(); j++){
			if(
				i == 0
				|| j == 0
				|| i == tempGrid.size() - 1
				|| j == tempGrid.size() - 1
			){
				temp.append(tempGrid.get(i).get(j));
				continue;
			}

			if(
				tempGrid.get(i).get(j) > tempGrid.get(i - 1).get(j)
				&& tempGrid.get(i).get(j) > tempGrid.get(i + 1).get(j)
				&& tempGrid.get(i).get(j) > tempGrid.get(i).get(j - 1)
				&& tempGrid.get(i).get(j) > tempGrid.get(i).get(j + 1)
			){
				temp.append("X");
			}else{
				temp.append(tempGrid.get(i).get(j));
			}
		}

		result.add(temp.toString());
	}

	return result;
}
profile
내 마음대로 코드 작성하는 세상

0개의 댓글