๐Ÿ“‚์ฝ”๋”ฉํ…Œ์ŠคํŠธ:CodingTest

๋ฐฑํŠธ๋ž˜ํ‚น(14890 ๊ฒฝ์‚ฌ๋กœ)

mc.thd 2024. 2. 14. 20:10

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

 

14890๋ฒˆ: ๊ฒฝ์‚ฌ๋กœ

์ฒซ์งธ ์ค„์— N (2 ≤ N ≤ 100)๊ณผ L (1 ≤ L ≤ N)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ์ง€๋„๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ์นธ์˜ ๋†’์ด๋Š” 10๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค.

www.acmicpc.net

 

๋ชจ๋“  ํ–‰์— ๋Œ€ํ•ด์„œ ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ง„ํ–‰ํ•˜๋ฉฐ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ธธ์ธ์ง€ ํ™•์ธํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋‹ค.


โœ…์™ผ์ชฝ ๋ธ”๋Ÿญ๊ณผ์˜ ๋†’์ด ์ฐจ์ด(gap) ๊ณ„์‚ฐ

  • gap == 0 : ๋‹ค์Œ ์นธ์œผ๋กœ ์žฌ๊ท€
  • gap == 1 : ์™ผ์ชฝ ๋ธ”๋Ÿญ์— ๊ณ„๋‹จ์„ ๋†“์„ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ ํ›„ ๋‹ค์Œ ์นธ์œผ๋กœ ์žฌ๊ท€
  • gap == -1 : ์ด๋ฉด ์˜ค๋ฅธ์ชฝ ๋ธ”๋Ÿญ์— ๊ณ„๋‹จ์„ ๋†“์„ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ ํ›„ ๊ณ„๋‹จ ์ดํ›„ ์นธ์œผ๋กœ ์žฌ๊ท€

 

โœ…๋ฐฑํŠธ๋ž˜ํ‚น ์ข…๋ฃŒ(basecase) ์กฐ๊ฑด

  • ๊ณ„๋‹จ์„ ๋งˆ์ง€๋ง‰ ๋ธ”๋Ÿญ์— ๋”ฑ ๋งž๊ฒŒ ๋†“๊ณ , ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ํƒ„ ๊ฒฝ์šฐ : ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ธธ ์ด๋ฏ€๋กœ ans+=1
  • ํ˜„์žฌ ํƒ์ƒ‰ ์œ„์น˜๊ฐ€ ๋งˆ์ง€๋ง‰ ๋ธ”๋Ÿญ์ธ ๊ฒฝ์šฐ
    • gap == 0 : ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ธธ ์ด๋ฏ€๋กœ ans+=1
    • gap == 1 : ์™ผ์ชฝ ๋ธ”๋Ÿญ์— ๊ณ„๋‹จ์„ ๋†“์„ ์ˆ˜ ์žˆ์œผ๋ฉด ans+=1
    • gap == -1 : ๊ณ„๋‹จ์˜ ๊ธธ์ด๊ฐ€ 1์ด๋ฉด ans+=1

 


์ฝ”๋“œ ๊ตฌํ˜„

 

๐Ÿ’ก์™ผ์ชฝ ๋ธ”๋Ÿญ์— ๊ณ„๋‹จ์„ ๋†“์„ ์—ฌ๋ถ„์˜ ์ž๋ฆฌ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ cnt๋ฅผ ํ™œ์šฉํ–ˆ๋‹ค.

static void check(int[][] array,int row,int col,int cnt){

}

cnt : ํ˜„์žฌ ์œ„์น˜ col์—์„œ ๊ณ„๋‹จ์„ ๋†“์„ ์ˆ˜ ์žˆ๋Š” ๊ธธ์ด๋ฅผ ๋œปํ•œ๋‹ค.

gap == 0 : ๊ณ„๋‹จ์„ ๋†“์„ ์ˆ˜ ์žˆ๋Š” ๊ธธ์ด๊ฐ€ 1 ์ฆ๊ฐ€ ํ•˜๋ฏ€๋กœ check(array,row,col+1,cnt+1) 

gap == 1 :  col+1 ์œ„์น˜์—์„œ ๊ณ„๋‹จ์„ ๋†“์„ ์ˆ˜ ์žˆ๋Š” ๊ธธ์ด๋Š” 1์ด๋ฏ€๋กœ check(array,row,col+1,1)

gap == -1 : col+L ์œ„์น˜์—์„œ ๊ณ„๋‹จ์„ ๋†“์„ ์ˆ˜ ์žˆ๋Š” ๊ธธ์ด๋Š” 0์ด๋ฏ€๋กœ check(array,row,col+L,0)

 

 

์ „์ฒด์ฝ”๋“œ

package com.mincheolsong;
import java.io.*;
import java.util.*;


public class Main {

    static int N,L;
    static int[][] arr;
    static int ans;

    static void check(int[][] array,int row,int col,int cnt){ // cnt : ๊ณ„๋‹จ์„ ๋†“์„ ์ˆ˜ ์žˆ๋Š” ๋ธ”๋Ÿญ์˜ ํฌ๊ธฐ

        if(col==N){ // ๊ณ„๋‹จ์„ ๋งˆ์ง€๋ง‰ ๋ธ”๋Ÿญ์— ๋”ฑ ๋งž๊ฒŒ ๋†“๊ณ , ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ํƒ„ ๊ฒฝ์šฐ
            ans+=1;
            return;
        }

        int gap; // ์ด์ „ ๋ธ”๋Ÿญ๊ณผ ๋†’์ด ์ฐจ์ด

        if(col-1<0){ // ํ•จ์ˆ˜ ์‹œ์ž‘ ์ž…๋ ฅ์ธ ๊ฒฝ์šฐ gap=0
            gap = 0;
        }else{
            gap = array[row][col] - array[row][col-1]; // ์ด์ „ ๋ธ”๋Ÿญ๊ณผ ๋†’์ด ์ฐจ์ด
        }

        if(col==N-1){ // ํ˜„์žฌ ํƒ์ƒ‰ ์œ„์น˜๊ฐ€ ๋งˆ์ง€๋ง‰ ๋ธ”๋Ÿญ์ธ ๊ฒฝ์šฐ
            if(gap==0){ // ๋†’์ด ์ฐจ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ
                ans+=1;
            }
            else if(gap==1 && cnt>=L){ // ํ˜„์žฌ ๋ธ”๋Ÿญ์ด 1๋งŒํผ ๋†’์ด ์žˆ๊ณ , ๊ณ„๋‹จ์„ ๋†“์„ ์—ฌ๋ถ„์˜ ๊ธธ์ด๊ฐ€ ์žˆ์œผ๋ฉด
                ans+=1;
            }
            else if(gap==-1 && L==1){ // ํ˜„์žฌ ๋ธ”๋Ÿญ์ด 1๋งŒํผ ๋‚ฎ๊ฒŒ ์žˆ๊ณ , ๊ณ„๋‹จ์˜ ๊ธธ์ด๊ฐ€ 1์ธ ๊ฒฝ์šฐ
                ans+=1;
            }
            return;
        }


        if(gap==0){ // ๋†’์ด ์ฐจ๊ฐ€ ์—†์œผ๋ฉด
            check(array,row,col+1,cnt+1); // ๋‹ค์Œ ๋ธ”๋Ÿญ์œผ๋กœ ์žฌ๊ท€
        }else if(gap==1){ // 1๋งŒํผ ํฌ๋ฉด
            if(cnt>=L){ // ๊ณ„๋‹จ์„ ๋†“์„ ์—ฌ๋ถ„์˜ ๊ธธ์ด๊ฐ€ ์žˆ์œผ๋ฉด
                check(array,row,col+1,1); // cnt๊ฐ€ 1์ธ ์ด์œ  = col+1 ์œ„์น˜์—์„œ ๊ณ„๋‹จ์„ ๋†“์„ ์ˆ˜ ์žˆ๋Š” ํฌ๊ธฐ๊ฐ€ 1์ด๊ธฐ ๋•Œ๋ฌธ
            }
        }else if(gap==-1){ // 1๋งŒํผ ์ž‘์œผ๋ฉด
            int temp = 0;
            for(int c=col;c<N;c++){ // ๊ณ„๋‹จ์„ ๋†“์„ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ธธ์ด ์ฒดํฌ
                if(array[row][c]==array[row][col]){
                    if(++temp==L) break;
                }else{
                    break;
                }
            }
            if(temp==L){ // ๊ณ„๋‹จ์„ ๋†“์„ ์ˆ˜ ์žˆ์œผ๋ฉด
                check(array,row,col+L,0); // cnt๊ฐ€ 0์ธ ์ด์œ  = col+L ์œ„์น˜์—์„œ ์ง์ „ ๋ธ”๋Ÿญ์—๋Š” ๊ณ„๋‹จ์„ ๋†“์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ
            }
        }
    }

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        N = Integer.parseInt(st.nextToken());
        L = Integer.parseInt(st.nextToken());

        arr = new int[N][N];
        ans = 0;

        for(int i=0;i<N;i++){
            st = new StringTokenizer(br.readLine());
            for(int j=0;j<N;j++){
                arr[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        for(int r=0;r<N;r++){
            check(arr,r,0,0);
        }
        System.out.println(ans);


        // ๋ฐฐ์—ด 90๋„ ํšŒ์ „์‹œํ‚ค๊ธฐ
        int[][] tmp = new int[N][N];

        for(int i=0;i<N;i++){
            for(int j=0;j<N;j++){
                tmp[i][j] = arr[N-1-j][i];
            }
        }

        for(int r=0;r<N;r++){
            check(tmp,r,0 ,0);
        }

        for(int r=0;r<N;r++){
            System.out.println(Arrays.toString(tmp[r]));
        }
        System.out.println(ans);

    }

}