문제 풀이 날짜: 2023.07.26
포스트 작성일: 2023.07.26

 

* 학습 목적으로 작성하는 글입니다. 풀이가 정석적이지 못할 수도 있습니다.

 

문제 출처

SWEA 1220번: Magnetic (D3)

 

키워드

배열 다루기, 문자열, 구현

 

풀이 접근법

  • 규칙을 찾는 구현 문제. 자석의 움직임을 구현하지 않아도 된다.
  • 자석 각각의 개수가 아닌, 교착상태가 된 덩어리의 수를 세야 하므로 주의한다.
  • 배열의 세로줄을 탐색하면서, 0이 아닌 것을 모두 String에 이어붙어서 규칙을 체크한다.
    • 북쪽이 N극이고 남쪽이 S극이므로 각각의 자석이 모두 끌려간 후, 테이블 위에는 1-2 순서로 붙은 자석만 남아있게 된다. (1-1-2, 1-2-2 모양 또한 가능)
    • 이때 String이 1로 시작하고 2로 끝나는 것을 찾을 게 아니라, “12”라는 substring을 몇 개 포함하는지를 알아내면 남아있는 자석의 수를 알 수 있다.
    • "12" 모양을 제외하고 그 위와 아래에 붙어있는 자석은 어차피 한 덩어리로 뭉쳐지므로 고려하지 않아도 된다.

 

코드

import java.util.*;
import java.io.*;

class Solution
{
	private static final int SIZE = 100;
	
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int T = 10;
		
		int[][] matrix = new int[SIZE][SIZE];
		
		StringTokenizer st;
		StringBuilder sb = new StringBuilder();
		for(int test_case = 1; test_case <= T; test_case++) {
			int N = Integer.parseInt(br.readLine());
            
			for(int i = 0; i < SIZE; i++) {
				st = new StringTokenizer(br.readLine());
				for(int j = 0; j < SIZE; j++) {
					matrix[i][j] = Integer.parseInt(st.nextToken());
				}
			}
			
			int answer = 0;
			StringBuilder temp;
			for(int j = 0; j < SIZE; j++) {
				temp = new StringBuilder();
				for(int i = 0; i < SIZE; i++) {
					if(matrix[i][j] != 0) {
						temp.append(matrix[i][j]);
					}
				}
				
				String result = temp.toString();
				result = result.replaceAll("12", "*");
				for(int i = 0; i < result.length(); i++) {
					if(result.charAt(i) == '*') {
						answer++;
					}
				}
			}
			
			sb.append("#").append(test_case).append(" ")
			.append(answer).append("\n");
		}
		
		System.out.println(sb);
	}
}

 

git 링크

(git 링크 첨부)

+ Recent posts