jusung-c
으 하기싫어
jusung-c
  • 공부 기록 (96)
    • Spring (42)
      • Spring 기초 이론 (8)
      • Spring 핵심 원리 - 기본 (9)
      • Blog 만들기 with SpringBoot (25)
    • JAVA (7)
      • Java 문법 (2)
      • 객체지향의 사실과 오해 (5)
    • Algorithm (47)
      • 자료구조 (3)
      • 완전탐색 (22)
      • 정렬 (4)
      • 이분탐색 (12)
      • 투 포인터 (4)
hELLO · Designed By 정상우.
jusung-c

으 하기싫어

Algorithm/완전탐색

BOJ 2529 - 부등호

2022. 3. 2. 15:22
 

2529번: 부등호

두 종류의 부등호 기호 ‘<’와 ‘>’가 k개 나열된 순서열 A가 있다. 우리는 이 부등호 기호 앞뒤에 서로 다른 한 자릿수 숫자를 넣어서 모든 부등호 관계를 만족시키려고 한다. 예를 들어, 제시

www.acmicpc.net

아이디어

 

탐색

일단 조건을 생각하지 말고 0~9까지의 숫자를 중복없이 순서있게 나열한다.

 

private static void rec_func(int k) throws IOException {
    if (k == M + 1) {
    	// 조건
        
    } else {
        for (int i = 0; i <= 9; i++) {
            if(visit[i] == 1) continue;

            selected[k] = i;
            visit[i] = 1;

            rec_func(k + 1);

            selected[k] = 0;
            visit[i] = 0;
        }

    }
}

 

조건

완성된 숫자의 조합이 부등호 사이에 들어갔을 때 참인 경우만 ArrayList에 담아준다.

 

private static boolean isvalid() {

    boolean possible = false;

    for (int i = 1; i <= N; i++) {
        // 뒤의 수가 큰 경우 && <
        if (((selected[i] - selected[i + 1]) < 0) && (inequality[i] == '<')) {
            possible = true;

        // 앞의 수가 큰 경우 && >
        } else if (((selected[i] - selected[i + 1]) > 0) && (inequality[i] == '>')) {
            possible = true;
        } else {
            possible = false;
        }

        if (possible == false) {
            break;
        }

    }

    return possible;
}

출력

탐색할 때 오름차순으로 순차적으로 탐색했으므로 ArrayList에 들어간 문자열들도 정렬되어있는 상태일 것이다.

따라서 최대/최소 값은 ArrayList의 끝/처음 값이다.

 

bw.write(result.get(result.size() - 1)+"\n");
bw.write(result.get(0));

 

 

개삽질의 삽질의 삽질의 연속으로 2시간 걸려서 풀었다.. ㅠㅠ

시간복잡도

N의 최댓값은 9이므로 최대 10개의 수를 중복없이 순차적으로 나열한 순열문제라서 아무리 오래 걸려봐야 10! 미만일 것이므로 가능한 접근법이다.

 

구현

import java.io.*;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class Main {
    static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    static int N, M;
    static char[] inequality;
    static int[] selected, visit;
    static ArrayList<String> result = new ArrayList<>();

    public static void main(String[] args) throws IOException {
        input();

        rec_func(1);

        bw.write(result.get(result.size() - 1)+"\n");
        bw.write(result.get(0));
        bw.close();
    }

    private static void rec_func(int k) throws IOException {
        if (k == M + 1) {
            // 조건 : 부등호를 만족하는가 ?
            if (isvalid() == true) {
                String s = "";
                for (int i = 1; i <= M; i++) {
                    s += selected[i];
                }
                result.add(s);

            }

        } else {
            for (int i = 0; i <= 9; i++) {
                if(visit[i] == 1) continue;

                selected[k] = i;
                visit[i] = 1;

                rec_func(k + 1);

                selected[k] = 0;
                visit[i] = 0;
            }

        }
    }

    private static boolean isvalid() {

        boolean possible = false;

        for (int i = 1; i <= N; i++) {
            // 뒤의 수가 큰 경우 && <
            if (((selected[i] - selected[i + 1]) < 0) && (inequality[i] == '<')) {
                possible = true;

            // 앞의 수가 큰 경우 && >
            } else if (((selected[i] - selected[i + 1]) > 0) && (inequality[i] == '>')) {
                possible = true;
            } else {
                possible = false;
            }

            if (possible == false) {
                break;
            }

        }

        return possible;
    }

    static void input() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        N = Integer.parseInt(br.readLine());
        M = N + 1;

        inequality = new char[N + 1];
        selected = new int[M + 1];
        visit = new int[10];

        st = new StringTokenizer(br.readLine(), " ");
        for (int i = 1; i <= N; i++) {
            inequality[i] = st.nextToken().charAt(0);
        }

    }
}

 

 

 

 

 

 

 

 

 

 

 

 

저작자표시 비영리 변경금지 (새창열림)

'Algorithm > 완전탐색' 카테고리의 다른 글

BOJ 15686 치킨 배달  (0) 2023.01.30
BOJ 2661 - 좋은 수열  (0) 2022.03.16
BOJ 2580 - 스도쿠  (0) 2022.02.28
BOJ 10819 - 차이를 최대로  (0) 2022.02.28
BOJ 1759 - 암호 만들기  (0) 2022.02.27
    'Algorithm/완전탐색' 카테고리의 다른 글
    • BOJ 15686 치킨 배달
    • BOJ 2661 - 좋은 수열
    • BOJ 2580 - 스도쿠
    • BOJ 10819 - 차이를 최대로
    jusung-c
    jusung-c

    티스토리툴바