DFS를 이용한 문제였습니다.

 

package algoridm;

import java.util.*;
public class 섬의개수 {

	private static int w;
	private static int h;
	
	private static int[][] arr;
	private static boolean[][] visited;
	private static int[] dx = {0, 0, 1, 1, -1, -1, 1, -1};
	private static int[] dy = {1,-1, 1, -1, 1, -1, 0, 0};
	
	private static int cnt = 0;
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while(true) {
			cnt = 0;
			w = sc.nextInt();
			h = sc.nextInt();
			if(w==0 &&h==0)break;
			sc.nextLine();
			

			arr = new int[h][w];
			visited = new boolean[h][w];
			
			for(int i=0; i<h;i++) {
				String str = sc.nextLine().replace(" ", "");
				for(int j=0; j<str.length();j++) {
					arr[i][j] = str.charAt(j)-'0';
				}
			}
			
			for(int i=0; i<h;i++) {
				for(int j=0; j<w;j++) {
					if(!visited[i][j] && arr[i][j]==1) {
						dfs(i,j);
						cnt++;
					}
				}
			}
			System.out.println(cnt);
		}
	}
	
	private static void dfs(int x, int y) {
		visited[x][y] = true;
		
		for(int i=0; i<8;i++) {
			int nx = x + dx[i];
			int ny = y + dy[i];
			
			if(nx>=0 && ny >=0 && nx<h && ny<w) {
				if(!visited[nx][ny] && arr[nx][ny]==1) dfs(nx,ny);
			}
		}
	}

}

 

문제를 풀다가 하나 실수 떄문에 시간이 엄청 오래 걸렸네요...

깊이우선탐색을 통해 푸는 방법은 맞았으나,

어이없게도 입력받는 데이터를 제대로 가공하지 못해서

정답이 나오지 않았습니다. ㅠㅠ

입력 받았을떄 공백으로 인해서 값이... 후.. 생각만해도 끔찍ㅎㅎ

뭐.. 다시 안그러면 되겠죠 ㅎㅎㅎ

점점 깊이우선탐색을 사용하는데 익숙해 지고 있습니다.

여기서 팁아닌 팁은 보통 탐색을할때 상하좌우 4가지 방법으로 움직이지만

대각선까지 포함되므로

소스에 있는 dx배열과 dy배열을 잘보셔야 될거 같습니다.

다른거는 딱히 어려운건 없었습니다. ㅎㅎ

https://www.acmicpc.net/problem/4963

 

1단계 무난히 풀수 있는 문제 였습니다.

if문과 for문만 잘 사용한다면 쉽게 풀 수 있을거 같습니다

 

정렬해서 푸는 방법도 있지만, 저는 정렬을 사용하지 않고 풀었습니다.

 

 

나의 풀이

class Solution {
    public int[] solution(int[] lottos, int[] win_nums) {
        int[] answer = new int[2];
        
        for(int i=0; i<lottos.length;i++){
            if(lottos[i]==0){//로또 번호 0인값 체크
                answer[0]++; // 0번째 인덱스에는 최대 많이 맞춘 갯수를 넣기 위해 추가
                continue;
            }
            for(int j=0; j<win_nums.length;j++){
                if(lottos[i]== win_nums[j]){ //로또번호가 맞을 경우
                    answer[0]++;// 0번째 인덱스에는 최대한 많이 맞춘 갯수를 넣기위해 추가
                    answer[1]++;// 1번째 인덱스는 가장 적게 맞춘 갯수를 넣기 위해 일치할때만 증가
                    break;
                }
            }
        }
  
        for(int i=0; i<2;i++){ // 0번째, 1번째 인덱스
             if(answer[i]==6)answer[i]=1; //1등
             else if(answer[i]==5)answer[i]=2;//2등
             else if(answer[i]==4)answer[i]=3;//3등
             else if(answer[i]==3)answer[i]=4;//4등
             else if(answer[i]==2)answer[i]=5;//5등
             else answer[i]=6;//꼴등
        }
        return answer;
    }
}

 

 

 


다른 풀이

import java.util.HashMap;
import java.util.Map;

class Solution {
    public int[] solution(int[] lottos, int[] win_nums) {
        Map<Integer, Boolean> map = new HashMap<Integer, Boolean>();
        int zeroCount = 0;

        for(int lotto : lottos) {
            if(lotto == 0) {
                zeroCount++;
                continue;
            }
            map.put(lotto, true);
        }


        int sameCount = 0;
        for(int winNum : win_nums) {
            if(map.containsKey(winNum)) sameCount++;
        }

        int maxRank = 7 - (sameCount + zeroCount);
        int minRank = 7 - sameCount;
        if(maxRank > 6) maxRank = 6;
        if(minRank > 6) minRank = 6;

        return new int[] {maxRank, minRank};
    }
}

 

아직 검색이나 자동완성이 없는 경우

 

Map, Set 같은 자료구조를 사용하기 힘들어서 시도해보지 못했다.

자동완성이 없을 때도 사용 할 수 있게 연습을 계속 해야겠다.

 

https://programmers.co.kr/learn/courses/30/lessons/77484?language=java#

+ Recent posts