Skip to content

<13주차> 맹세 [강서현] #63

Description

@seohyunk09

문제

Image

예제 입력 1
4
international =>
collegiate
programming
contest
예제 출력 1
YES=>

Image

NO
NO
NO

** 알파벳을 나누어서 바라보기 => 모든 분할의 경우===> 브루트포스!!
==> 1글자 자르기 vs 2글자 자르기 ==> 조건 정의(++경로 중 하나라도 성공하면 YES, 아니면 NO)

브루트 포스 - 문자열을 1글자 또는 2글자씩 자르는 모든 경우를 다 재귀 호출하면서 찾기 때문에:


import java.util.*;

public class Main {
    static Set<String> elements = new HashSet<>();
    static boolean found;
    static boolean[] visited;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        initElements();

        int T = Integer.parseInt(sc.nextLine());
        while (T-- > 0) {
            String s = sc.nextLine().toLowerCase();
            found = false; //// 초기화: 아직 성공하지 않음
            visited = new boolean[s.length() + 1]; // ✅ visited 추가
            brute(s, 0);
            System.out.println(found ? "YES" : "NO");
        }
    }

    // 완전 브루트포스 탐색
    static void brute(String s, int idx) {
        if (found || visited[idx]) return; // ✅ 메모이제이션

        if (idx == s.length()) {//// 문자열 끝까지 도달했으면 성공
            found = true;
            return;
        }

        visited[idx] = true;

        if (idx + 1 <= s.length()) {
            String one = s.substring(idx, idx + 1);
            if (elements.contains(one)) {
                brute(s, idx + 1);
            }
        }

        if (idx + 2 <= s.length()) {
            String two = s.substring(idx, idx + 2);
            if (elements.contains(two)) {
                brute(s, idx + 2);
            }
        }
    }

    static void initElements() {
        String[] raw = {
          "H","He","Li","Be","B","C","N","O","F","Ne",
                "Na","Mg","Al","Si","P","S","Cl","Ar","K","Ca",
                "Sc","Ti","V","Cr","Mn","Fe","Co","Ni","Cu","Zn",
                "Ga","Ge","As","Se","Br","Kr","Rb","Sr","Y","Zr",
                "Nb","Mo","Tc","Ru","Rh","Pd","Ag","Cd","In","Sn",
                "Sb","Te","I","Xe","Cs","Ba","La","Ce","Pr","Nd",
                "Pm","Sm","Eu","Gd","Tb","Dy","Ho","Er","Tm","Yb",
                "Lu","Hf","Ta","W","Re","Os","Ir","Pt","Au","Hg",
                "Tl","Pb","Bi","Po","At","Rn","Fr","Ra","Ac","Th",
                "Pa","U","Np","Pu","Am","Cm","Bk","Cf","Es","Fm",
                "Md","No","Lr", "Rf","Db","Sg","Bh","Hs","Mt","Ds",
                "Rg","Cn","Fl","Lv"
        };
        for (String e : raw) {
            elements.add(e.toLowerCase());
        }
    }
}

백트래킹+

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

public class num3407 {
    static Set<String> elements = new HashSet<>();
    static boolean[] visited;
    static boolean found;

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

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine().trim());

        while (T-- > 0) {
            String word = br.readLine().trim().toLowerCase();
            visited = new boolean[word.length() + 1];
            found = false;
            dfs(word, 0);
            System.out.println(found ? "YES" : "NO");
        }
    }

    static void dfs(String word, int idx) {
        if (found) return;
        if (idx == word.length()) {
            found = true;
            return;
        }
        if (visited[idx]) return;

        visited[idx] = true;


        if (idx + 1 <= word.length()) {
            String one = word.substring(idx, idx + 1);
            if (elements.contains(one)) dfs(word, idx + 1);
        }


        if (idx + 2 <= word.length()) {
            String two = word.substring(idx, idx + 2);
            if (elements.contains(two)) dfs(word, idx + 2);
        }
    }

    static void initElements() {
        String[] raw = {
                "H","He","Li","Be","B","C","N","O","F","Ne",
                "Na","Mg","Al","Si","P","S","Cl","Ar","K","Ca",
                "Sc","Ti","V","Cr","Mn","Fe","Co","Ni","Cu","Zn",
                "Ga","Ge","As","Se","Br","Kr","Rb","Sr","Y","Zr",
                "Nb","Mo","Tc","Ru","Rh","Pd","Ag","Cd","In","Sn",
                "Sb","Te","I","Xe","Cs","Ba","La","Ce","Pr","Nd",
                "Pm","Sm","Eu","Gd","Tb","Dy","Ho","Er","Tm","Yb",
                "Lu","Hf","Ta","W","Re","Os","Ir","Pt","Au","Hg",
                "Tl","Pb","Bi","Po","At","Rn","Fr","Ra","Ac","Th",
                "Pa","U","Np","Pu","Am","Cm","Bk","Cf","Es","Fm",
                "Md","No","Lr", "Rf","Db","Sg","Bh","Hs","Mt","Ds",
                "Rg","Cn","Fl","Lv"
        };

        for (String s : raw) {
            elements.add(s.toLowerCase());
        }
    }
}*/




dp

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

public class num3407{
    static Set<String> elements = new HashSet<>();

    public static void main(String[] args) throws Exception {
        initElements();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine().trim());
        while (T-- > 0) {
            String s = br.readLine().trim().toLowerCase();
            int n = s.length();
            boolean[] dp = new boolean[n + 1];
            dp[0] = true;

            for (int i = 0; i < n; i++) {
                if (!dp[i]) continue;

                if (i + 1 <= n && elements.contains(s.substring(i, i + 1))) {
                    dp[i + 1] = true;
                }
                if (i + 2 <= n && elements.contains(s.substring(i, i + 2))) {
                    dp[i + 2] = true;
                }
            }

            System.out.println(dp[n] ? "YES" : "NO");
        }
    }

    static void initElements() {
        String[] arr = {
                "H","He","Li","Be","B","C","N","O","F","Ne",
                "Na","Mg","Al","Si","P","S","Cl","Ar","K","Ca",
                "Sc","Ti","V","Cr","Mn","Fe","Co","Ni","Cu","Zn",
                "Ga","Ge","As","Se","Br","Kr","Rb","Sr","Y","Zr",
                "Nb","Mo","Tc","Ru","Rh","Pd","Ag","Cd","In","Sn",
                "Sb","Te","I","Xe","Cs","Ba","La","Ce","Pr","Nd",
                "Pm","Sm","Eu","Gd","Tb","Dy","Ho","Er","Tm","Yb",
                "Lu","Hf","Ta","W","Re","Os","Ir","Pt","Au","Hg",
                "Tl","Pb","Bi","Po","At","Rn","Fr","Ra","Ac","Th",
                "Pa","U","Np","Pu","Am","Cm","Bk","Cf","Es","Fm",
                "Md","No","Lr", "Rf","Db","Sg","Bh","Hs","Mt","Ds",
                "Rg","Cn","Fl","Lv"
        };
        for (String e : arr) {
            elements.add(e.toLowerCase());
        }
    }
}

*/

/*

public class num3407{
    static Set<String> elements = new HashSet<>();

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        initElements();  // 원소 기호 초기화

        int T = Integer.parseInt(sc.nextLine());
        while (T-- > 0) {
            String s = sc.nextLine().toLowerCase();
            int n = s.length();
            boolean[] dp = new boolean[n + 1];
            dp[0] = true;

            for (int i = 0; i < n; i++) {
                if (!dp[i]) continue;

                // 1글자
                if (i + 1 <= n && elements.contains(s.substring(i, i + 1))) {
                    dp[i + 1] = true;
                }
                // 2글자
                if (i + 2 <= n && elements.contains(s.substring(i, i + 2))) {
                    dp[i + 2] = true;
                }
            }

            System.out.println(dp[n] ? "YES" : "NO");
        }
    }

    // 📘 원소 기호를 모두 소문자 형태로 저장
    static void initElements() {
        String[] arr = {
                 "H","He","Li","Be","B","C","N","O","F","Ne",
                "Na","Mg","Al","Si","P","S","Cl","Ar","K","Ca",
                "Sc","Ti","V","Cr","Mn","Fe","Co","Ni","Cu","Zn",
                "Ga","Ge","As","Se","Br","Kr","Rb","Sr","Y","Zr",
                "Nb","Mo","Tc","Ru","Rh","Pd","Ag","Cd","In","Sn",
                "Sb","Te","I","Xe","Cs","Ba","La","Ce","Pr","Nd",
                "Pm","Sm","Eu","Gd","Tb","Dy","Ho","Er","Tm","Yb",
                "Lu","Hf","Ta","W","Re","Os","Ir","Pt","Au","Hg",
                "Tl","Pb","Bi","Po","At","Rn","Fr","Ra","Ac","Th",
                "Pa","U","Np","Pu","Am","Cm","Bk","Cf","Es","Fm",
                "Md","No","Lr", "Rf","Db","Sg","Bh","Hs","Mt","Ds",
                "Rg","Cn","Fl","Lv"
        };
        for (String e : arr) {
            elements.add(e.toLowerCase());
        }
    }
}
*/



/*

public class num3407  {
    static Set<String> elements = new HashSet<>();
    static boolean[] dp;
    static int len;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        // 원소 집합 초기화
        initElements();

        int T = Integer.parseInt(sc.nextLine());
        for (int t = 0; t < T; t++) {
            String word = sc.nextLine().toLowerCase(); // 소문자 처리
            len = word.length();
            dp = new boolean[len + 1];
            dp[0] = true; // 시작점

            for (int i = 0; i < len; i++) {
                if (!dp[i]) continue;

                // 1글자 원소
                if (i + 1 <= len) {
                    String one = word.substring(i, i + 1);
                    if (elements.contains(one)) dp[i + 1] = true;
                }

                // 2글자 원소
                if (i + 2 <= len) {
                    String two = word.substring(i, i + 2);
                    if (elements.contains(two)) dp[i + 2] = true;
                }
            }

            System.out.println(dp[len] ? "YES" : "NO");
        }
    }

    // 원소 집합 초기화 (소문자로 저장)
    static void initElements() {
        String[] raw = {
                "H","He","Li","Be","B","C","N","O","F","Ne",
                "Na","Mg","Al","Si","P","S","Cl","Ar","K","Ca",
                "Sc","Ti","V","Cr","Mn","Fe","Co","Ni","Cu","Zn",
                "Ga","Ge","As","Se","Br","Kr","Rb","Sr","Y","Zr",
                "Nb","Mo","Tc","Ru","Rh","Pd","Ag","Cd","In","Sn",
                "Sb","Te","I","Xe","Cs","Ba","La","Ce","Pr","Nd",
                "Pm","Sm","Eu","Gd","Tb","Dy","Ho","Er","Tm","Yb",
                "Lu","Hf","Ta","W","Re","Os","Ir","Pt","Au","Hg",
                "Tl","Pb","Bi","Po","At","Rn","Fr","Ra","Ac","Th",
                "Pa","U","Np","Pu","Am","Cm","Bk","Cf","Es","Fm",
                "Md","No","Lr", "Rf","Db","Sg","Bh","Hs","Mt","Ds",
                "Rg","Cn","Fl","Lv"
        };

        for (String e : raw) {
            elements.add(e.toLowerCase());
        }
    }
}
*/

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions