[백준 1000] 알 수 없는 문장 - Java

2024. 12. 22. 19:30·Computer Science/Algorithm

백트래킹으로 접근하고자 생각했다.

    1. 주어진 단어들을 무제한 사용할 수 있음으로, 문자열을 해석하는 각 순간에 같은 단어를 여러번 사용할 수 있다.

알고리즘

    1. 주어진 인덱스부터 적용가능한 모든 단어들을 탐색한다.
    1. 해석가능한 단어를 찾는다.
  • 2-1. dp테이블에 현재까지의 비용을 계산 후, 최솟값으로 업데이트 한다.
  • 2-2. 업데이트 시, 2 부터 다시 시작한다.
  • 2-3. 업데이트가 안될 시, 이를 무시한다.

(2) 과정을 통해 특정 인덱스에서 실행 가능한 최소비용으로만 프로그램을 실행할 수 있도록 한다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Main {
    private static int minCost = Integer.MAX_VALUE;
    private static int dp[] = new int[51];

    public static void main(String[] args) throws IOException {
        Arrays.fill(dp, Integer.MAX_VALUE);
        dp[0] = 0;
        final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        final String target = br.readLine();
        final int inputCount = Integer.parseInt(br.readLine());

        final List<String> words = new ArrayList<>();
        for (int i = 0; i < inputCount; i++) {
            final String input = br.readLine();
            if (input.isBlank()) {
                continue;
            }
            words.add(input);
        }

        getMine(words, 0, 0, target);

        //  백트래킹
        // 1. 시작 인덱스 0
        // 2. 해결가능한 단어 찾았을 시 다음 인덱스부터 단어 찾고 계산.
        // 3. 문장길이 + 1 이 현재 인덱스가 됐을 때, 종료
        //  3-1. 없는 놈 찾으면 스킵
        // 4. (3) 까지의 결과를 계속해서 최솟값 업데이트

        if (minCost == Integer.MAX_VALUE) {
            System.out.print(-1);
            return;
        }
        System.out.print(minCost);
    }

    public static void getMine(final List<String> words, final int currIndex, final int currCost, final String targetString) {
        if (currCost >= minCost) {
            return;
        }
        if (currIndex == targetString.length()) {
            minCost = Math.min(minCost, currCost);
            return;
        }
        for (final String word : words) {
            final int wordLength = word.length();
            if (wordLength + currIndex > targetString.length()) {
                continue;
            }
            final String separatedString = targetString.substring(currIndex, currIndex + wordLength);
            if (isEqual(separatedString, word)) {
                final int nextCost = currCost + getCost(separatedString, word);
                if (dp[wordLength + currIndex] > nextCost) {
                    dp[wordLength + currIndex] = nextCost;
                    getMine(words, currIndex + wordLength, nextCost, targetString);
                }
            }
        }
    }

    public static boolean isEqual(final String target, final String word) {
        final char[] targetArr = target.toCharArray();
        final char[] wordArr = word.toCharArray();
        Arrays.sort(targetArr);
        Arrays.sort(wordArr);
        return Arrays.equals(targetArr, wordArr);
    }

    public static int getCost(final String target, final String word) {
        int count = 0;
        for (int i = 0; i < word.length(); i++) {
            if (target.charAt(i) != word.charAt(i)) {
                count++;
            }
        }
        return count;
    }
}

'Computer Science > Algorithm' 카테고리의 다른 글

Dijkstra Algorithm - 다익스트라 알고리즘 분석  (0) 2023.07.17
'Computer Science/Algorithm' 카테고리의 다른 글
  • Dijkstra Algorithm - 다익스트라 알고리즘 분석
윤희종
윤희종
호기심을 잃지 말자 지적, 질문은 언제나 환영합니다 ;)
  • 윤희종
    서버견문록
    윤희종
  • 전체
    오늘
    어제
    • 분류 전체보기 (36)
      • 데일리 플랜 (1)
      • 이것저것 (4)
      • Java (6)
      • Spring (12)
        • SpringBoot (10)
        • Spring MVC (0)
      • Computer Science (4)
        • Network (1)
        • Operating System (0)
        • Data Structure (0)
        • Algorithm (2)
        • Database (0)
      • IOS (0)
      • 프로그래머스 문제풀이 (2)
      • 프로젝트 일기 (7)
        • 한편의 수학 학원 (7)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    springboot
    알고리즘
    스프링 시큐리티 사용법
    스프링 부트 인증 우회
    SecurityFilterChain
    스프링 시큐리티 구성
    캐시
    인증 우회 테스트
    mysql 쿼리 최적화
    servlet
    제네릭
    비동기 처리 유의점
    성능 개선
    Spring
    스프링 부트
    SecurityFilterChain 구성
    read through
    인증 테스트
    cache write back
    스프링
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
윤희종
[백준 1000] 알 수 없는 문장 - Java
상단으로

티스토리툴바