my study.

Coding Test/Softeer

[소프티어] Recovering the Region, java

fftl 2025. 2. 18. 14:54

- 문제

 

Softeer - 현대자동차그룹 SW인재확보플랫폼

 

softeer.ai

- 풀이

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

public class Main {

    //여러가지의 답이 나올 수 있는 문제입니다.
    //처음 문제를 보았을 때, 꽤 어려운 문제라는 생각을 했습니다.
    //bfs를 써야하나? 영역안에 1~N까지의 숫자가 들어오는 방법이 다양할텐데, 계속 다음 영역을 찾다가 더이상
    //나오지 않으면 백트래킹으로 다시 살펴야 하나? 와 같은 생각을 하고 있었습니다.

    //하지만 천천히 문제를 다시 읽어보니 바로 해답이 나왔습니다.
    //문제에서 주어지는 조건에 다음과 같이 적혀있습니다. 
    //같은 가로줄에 있는 수들은 모두 달라야하고,
    //같은 세로줄에 있는 수들도 모두 달라야한다.

    //위 두 조건을 보면 이미 내가 찾고자 하는 영역들은 이미 나누어져있다는 사실을 알 수 있었습니다.
    //따라서 가로줄로만 영역을 나누어도 이미 같은 수가 없기 때문에 영역으로 인정될 수 있었고,
    //세로줄로만 영역을 나누어도 영역이 인정될 수 있었습니다.
    
    //이 해법을 찾고 문제를 풀었습니다.
    
    public static void main(String[] args) throws Exception {

        //BufferedReader를 이용해 board의 크기 N을 입력받았습니다.
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        int N = Integer.parseInt(br.readLine());

        //사실 위의 규칙에 따르면 주어지는 board의 내용은 볼 필요가 없습니다.
        //N X N 크기를 가지는 board에 가로줄, 또는 세로줄로 영역을 나누어만 주면 되기 때문입니다.
        
        //영역을 구분해줄 idx를 1으로 선언해줍니다.
        int idx = 1;

        //이제 답을 반환해줄 StringBuilder에 board 모양으로 각 영역을 입력해줍니다.
        //저는 가로줄로 영역을 나누어 주기로 하였습니다.
        StringBuilder sb = new StringBuilder();
        for(int i=0; i<N; i++){

            //각 i라인에 같은 idx로 채워준 뒤,
            for(int j=0; j<N; j++){
                sb.append(idx+" ");
            }

            //줄바꿈을 해주고 idx를 증가시켜줍니다.
            sb.append("\n");
            idx++;
        }

        //이렇게 완성된 StringBuilder를 출력합니다.
        System.out.println(sb.toString());
    }
}