알고리즘/프로그래머스
[Java] 프로그래머스 석유 시추
24시간이모자란
2023. 12. 2. 11:14
문제
코딩테스트 연습 - [PCCP 기출문제] 2번 | 프로그래머스 스쿨 (programmers.co.kr)
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
가장 많은 석유량을 return 해보자
풀이
풀이는 다음과 같습니다.
- dfs 하면서, 석유 덩어리가 나오면 해당 덩어리 전처에 마킹을 합니다.
- 해시맵에 마킹번호, 덩어리 개수를 저장합니다.
- 해시맵에 저장이 끝난 후 , 시추관으로 위에서 아래로 탐색하면서 Set 에 마킹 넘버링을 담습니다.
- answer 변수를 update 하면서 모든 열 에대해 탐색합니다.
- answer를 리턴합니다.
Stream.of(s).mapToInt(myMap::get).sum();
처음에 Stream.of(set) 구조로 스트림을 구성했는데, nullPointer 오류 가 떴다. 이유는 Stream.of( A ) 메서드는 A 타입을 Stream< A > 이렇게 감싸는 형태이기 때문이다. 위의 코드는 Stream< Set<Integer> > 으로 mapToInt 에 들어간다, 하지만 map 의 key는 Integer이기 때문에 키가 존재하지 않아서 nullpointerException 이 발생하였다.
다음 코드처럼 수정하여서 Stream<Integer> 타입으로 구성하게 하였다.
int addAll = s
.stream()
.mapToInt(myMap::get)
.sum();
코드
import java.util.*;
import java.util.stream.*;
class Solution {
int dx[] = {0,0,1,-1};
int dy[] = {1,-1,0,0};
public int solution(int[][] land) {
int answer = 0;
List<int[]> list = new ArrayList<>();
HashMap<Integer, Integer> myMap = new HashMap<>();
int idx = 2;
int cnt = 0;
for(int i =0 ;i < land.length; i++){
for(int j = 0 ;j < land[0].length;j ++){
if(land[i][j] == 1){
cnt = dfs(land,i,j,idx);
myMap.put(idx++,cnt);
}
}
}
for(int j =0 ;j< land[0].length; j++){
Set<Integer> s = new HashSet<>();
for(int i = 0;i < land.length ;i ++){
if(land[i][j] > 1 && !s.contains(land[i][j] )){
s.add(land[i][j]);
}
}
int addAll = s
.stream()
.mapToInt(myMap::get)
.sum();
answer = Math.max(answer, addAll);
}
return answer;
}
public int dfs(int[][] l , int x, int y,int m){
if(x < 0 || y < 0 || x > l.length -1 || y > l[0].length-1 || l[x][y] !=1 )return 0;
int ret = 1;
l[x][y] = m;
for(int k =0; k < 4; k++){
ret += dfs(l,x + dx[k], y+dy[k], m);
}
return ret;
}
}