레벨업 일지

[Java] 프로그래머스 석유 시추 본문

알고리즘/프로그래머스

[Java] 프로그래머스 석유 시추

24시간이모자란 2023. 12. 2. 11:14

문제

코딩테스트 연습 - [PCCP 기출문제] 2번 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

가장 많은 석유량을 return 해보자

풀이

풀이는 다음과 같습니다.

  1. dfs 하면서, 석유 덩어리가 나오면 해당 덩어리 전처에 마킹을 합니다.
  2. 해시맵에 마킹번호, 덩어리 개수를 저장합니다.
  3. 해시맵에 저장이 끝난 후 , 시추관으로 위에서 아래로 탐색하면서 Set 에 마킹 넘버링을 담습니다.
  4. answer 변수를 update 하면서 모든 열 에대해 탐색합니다.
  5. 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;
    }
}

 

 

 

Comments