화분

[구름톤 챌린지 20일차] 연결 요소 제거하기 본문

Study/CODINGTEST

[구름톤 챌린지 20일차] 연결 요소 제거하기

ExcellEast 2023. 9. 10. 10:38

드디어... 구름톤 챌린지의 끝에 도달했다. 하지만 마지막 문제를 기간 내에 못 풀어서 아쉽게도 20개를 다 모으진 못했다..ㅠㅠ 좀만 더 부지런할껄. 그래도 여기까지 꾸준히 풀어온 나 자신에게 칭찬해주고 싶다.

 

이번 문제 풀이의 접근 방식은 옳았다고 생각하나, 논리적 절차에 있어 오류의 여지가 있어서 모든 케이스를 통과하지 못했다. 그래서 문제가 시작되고 24시간이 지나고 올라온 정해코드를 하나씩 따라 적고 구동해보고 어디서 틀렸는지 확인해보면서 풀었다. 이번 문제를 통해 배운점이나 느낀 점, 어려웠던 점은 다음과 같다.

배운 점

조건식에 논리 연산자를 사용할 때 잊지 말아야 할 점이 있다. 쇼트 서킷(short circuit)으로 인한 문제가 발생하지 않도록 작성해야 한다는 점이다. 나같은 경우 or 논리 연산자를 3개 이상 썼는데 이 부분에서 틀렸다. 첫번째 조건을 만족함으로써 뒤의 조건들은 실행하지 않고 통과됐기 때문이다. 이럴땐 or보다 &&를 쓰도록 했어야 했다. 

그리고 논리적 절차에 유의하며 코드를 작성해야 하고 이 부분에서 개선 되야 앞으로 코딩테스트 등을 볼때 성적이 좋아질 거라고 생각한다. 이 부분이 어렵지만 많은 문제를 풀면서 개선될거라고 믿는다.

느낀 점

조건식에서 논리연산자는 최대한 줄여써야 한다고 생각했다. 조금씩 발전하고 있다고 느낀다. 이전엔 어떻게 작동하는지 알면서도 bfs를 구현하는데도 오랜 시간이 걸렸는데 지금은 익숙해져 가는지 작성하는데 걸리는 시간이 줄어들고 있는거 같다.

어려웠던 점

디버깅 자체가 쉬운 작업이 아니라고 생각하지만, 위의 문제들을 해결하는 점 이외에 딱히 어려웠던 점은 없었던거 같다.

 

작성한 코드는 다음과 같다.

import java.io.*;
import java.util.*; 
class Main {
	static String[][] board;
	static boolean[][] visited;
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[] NKQ = br.readLine().split(" ");
		int N =  Integer.parseInt(NKQ[0]);
		int K =  Integer.parseInt(NKQ[1]);
		int Q = Integer.parseInt(NKQ[2]);
		board = new String[N][N];
		visited = new boolean[N][N];
		
		for(int i = 0 ; i < N; i++){
			board[i] = br.readLine().split("");
		}
		
		for(int i = 0; i < Q; i++){
			String[] YXD = br.readLine().split(" ");
			int Y = Integer.parseInt(YXD[0]) - 1;
			int X = Integer.parseInt(YXD[1]) - 1;
			String D = YXD[2];
			
			board[Y][X] = D;
			bfs(Y, X, K, N, D);
		}
		
		for(int i = 0; i < N ; i++){
			for(int j= 0; j < N; j++){
				System.out.print(board[i][j]);
			}
			System.out.println("");
		}
		
	}
	
	public static void bfs(int y, int x, int k, int N, String d){
		int[] dy = {-1, 0 , 1, 0};
		int[] dx = {0, 1, 0, -1};
		ArrayList<Integer[]> visitedPoint = new ArrayList<>();
		visited = new boolean[N][N];
		Queue<Integer[]> q = new LinkedList<>();
		Integer [] yx = {y, x};
		q.add (yx);
		
		visited[yx[0]][yx[1]] = true;
		while(!q.isEmpty()){
			Integer[] yxPoint = q.poll();
			visitedPoint.add(yxPoint);
			for(int i = 0; i < 4; i++){
				int nextX = yxPoint[1] + dx[i];
				int nextY = yxPoint[0] + dy[i];
				if(nextX >= 0 && nextX < N && nextY >= 0 && nextY < N){
					if(!visited[nextY][nextX] && board[nextY][nextX].equals(d)){
						Integer[] temp = {nextY, nextX};
						q.add(temp);
						visited[nextY][nextX] = true;
					}
				}
			}//for문 끝
			if(visitedPoint.size() >= k){
				for(Integer[] ele : visitedPoint){
					board[ele[0]][ele[1]] = ".";
				}
			}
			
		}//while문 끝
	}//bfs 끝
	
	
}