1220 Magnetic

Sungmin·2023년 11월 7일
0

SWEA 알고리즘

목록 보기
16/26

Magnetic URL

내 풀이 1

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

public class SW1220 {
    static StringBuilder sb = new StringBuilder();
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        for (int t = 1; t <= 1; t++) {
            int N = Integer.parseInt(br.readLine());
            int[][] graph = new int[N][N];
            int answer = 0;

            for (int i = 0; i < N; i++) {
                StringTokenizer st = new StringTokenizer(br.readLine());
                for (int j = 0; j < N; j++) {
                    graph[i][j] = Integer.parseInt(st.nextToken());
                }
            }
            // System.out.println(Arrays.deepToString(graph));

            for (int i = 0; i < N; i++) {
                List<Integer> list = new ArrayList<>();
                for (int j = 0; j < N; j++) {
                    if (graph[j][i] != 0) {
                        list.add(graph[j][i]);
                    }
                }
                System.out.println("===========한행=============");
                //남아있는경우
                int size = list.size();
                if (list.size() != 0) {
                    
                    for (int k = 0; k < list.size(); k++) {
                        System.out.println("제거 전: " + list);
                        if (list.get(0) == 2) {
                            list.remove(0);
                        } else if (list.get(list.size() - 1) == 1) {
                            list.remove(list.size() - 1);
                        }

                        if (size == list.size()) break;

                        System.out.println("제거 후: " + list);
                    }

                    int nCount = Collections.frequency(list, 1);
                    int sCount = Collections.frequency(list, 2);
                    answer += Math.min(nCount, sCount);
                    System.out.println("answer: " + answer);
                }
                
            }
            sb.append("#").append(t).append(" ").append(answer).append("\n");
        }
        System.out.println(sb);
    }
}

맨 처음 풀었던 풀이 방식이다.

예시를 보고 문제를 잘 못 이해해서 리스트에 살아있을 수 있는 자성체들을 담고 그 안에서 1의 개수와 2의 개수를 구하고 그 중 최소값이 교착상태가 된다고 생각하였다.

이렇게 풀 경우 중복되는 부분을 고려하지 못하게 된다. 너무 어렵게 생각한 방식이었다.


내 풀이 2

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

public class SW1220 {
    static StringBuilder sb = new StringBuilder();
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        for (int t = 1; t <= 10; t++) {
            int N = Integer.parseInt(br.readLine());
            int[][] graph = new int[N][N];
            int answer = 0;

            for (int i = 0; i < N; i++) {
                StringTokenizer st = new StringTokenizer(br.readLine());
                for (int j = 0; j < N; j++) {
                    graph[i][j] = Integer.parseInt(st.nextToken());
                }
            }
            
            for (int i = 0; i < N; i++) {    
                boolean isOne = false; //1다음 2가 나오는지 확인
                for (int j = 0; j < N; j++) {
                    if (graph[j][i] == 1) {
                        isOne = true;
                    } else if (graph[j][i] == 2 && isOne) {
                        answer++;
                        isOne = false;
                    }
                }
            }
            sb.append("#").append(t).append(" ").append(answer).append("\n");
        }
        System.out.println(sb);
    }
}

예시의 100x100을 넣어서 잘못된 부분을 찾았고 간단한 방식의 풀이를 생각하였다.

배운점

풀이

  1. 먼저 2차원 배열에 값을 전부 넣는다.
  2. 2중 for문을 돌며, 1이 나올경우엔 항상 isOne을 true로 해 준다.
  3. 1이 먼저 나온상태에서 2가 나올경우 answer을 1증가시킨다. 그러고 isOne은 false로 변경한다.

우선 문제를 제대로 이해하지 못한 점이 문제점 이었고, 너무 어렵게 생각한 것도 있다. D3문제인 만큼 너무 어렵게 생각하지 말자.

profile
Let's Coding

0개의 댓글