[Python] BOJ / 1062번 / 가르침

2022. 6. 2. 16:47·🥇 Problem Solving/Backtracking
 

1062번: 가르침

첫째 줄에 단어의 개수 N과 K가 주어진다. N은 50보다 작거나 같은 자연수이고, K는 26보다 작거나 같은 자연수 또는 0이다. 둘째 줄부터 N개의 줄에 남극 언어의 단어가 주어진다. 단어는 영어 소문

www.acmicpc.net


📝 풀이

  • 백트래킹 사용
  • 남극언어의 모든 단어는 "anta"로 시작되고, "tica"로 끝난다.
    • 기본적으로 알아야하는 글자가 5개(a, c, i, n, t)이다.
      • k(가르칠 글자의 수)가 5보다 작을 경우 읽을 수 있는 단어가 없다.
      • k(가르칠 글자의 수)가 26(a, b, c, ..., z)일 경우 모든 단어를 읽을 수 있다.
  • 배운 단어와 배우지 않은 단어를 구분하기 위해 배열을 사용하며 인덱스는 아스키코드(ord())를 통해 접근한다.
  • set을 활용하여 단어에서 중복을 제거함으로써 실행 시간을 줄일 수 있다.

💻 소스코드

import sys

input = sys.stdin.readline

def dfs(start, cnt):
    global ans

    if cnt == k - 5:    # 5개 글자(a, c, i, n, t)는 이미 배웠음
        tmp = 0
        for word in words:
            is_contain = True # 배운 글자로 해당 단어를 읽을 수 있는지 확인
            for c in word:
                if not check[ord(c) - ord('a')]:    # 해당 단어에 배우지 않은 글자가 있는 경우
                    is_contain = False
                    break

            # 해당 단어를 읽을 수 있는 경우
            if is_contain:
                tmp += 1

        ans = max(ans, tmp)
        return
    
    for i in range(start, 26):
        if not check[i]:
            check[i] = True
            dfs(i, cnt + 1)
            check[i] = False

n, k = map(int, input().split())

# set을 활용하여 중복을 제거함으로써 해당 단어를 읽는데 필요한 최소한의 글자를 구함
words = [set(input().rstrip()) for _ in range(n)]
check = [False] * 26
ans = 0

# 가르칠 글자의 수가 5(a, n, t, i, c)보다 작은 경우
if k < 5:
    print(0)    # 읽을 수 있는 단어가 없음
    exit(0)
# 가르칠 글자의 수가 26(a, b, c, ..., z)인 경우
elif k == 26:
    print(n)    # 모든 단어를 읽을 수 있음
    exit(0)

# a, c, i, n, t 는 무조건 배워야 함
for c in ('a', 'c', 'i', 'n', 't'):
    check[ord(c) - ord('a')] = True

dfs(0, 0)
print(ans)
저작자표시 (새창열림)

'🥇 Problem Solving > Backtracking' 카테고리의 다른 글

[Python] BOJ / 1038번 / 감소하는 수  (0) 2022.06.25
[Python] BOJ / 12100번 / 2048 (Easy)  (0) 2022.05.02
[Python] BOJ / 1987번 / 알파벳  (0) 2022.04.20
[Python] BOJ / 2580번 / 스도쿠  (0) 2022.04.07
[Python] BOJ / 1759번 / 암호 만들기  (0) 2022.04.07
'🥇 Problem Solving/Backtracking' 카테고리의 다른 글
  • [Python] BOJ / 1038번 / 감소하는 수
  • [Python] BOJ / 12100번 / 2048 (Easy)
  • [Python] BOJ / 1987번 / 알파벳
  • [Python] BOJ / 2580번 / 스도쿠
Baeg-won
Baeg-won
  • Baeg-won
    좋았다면 추억이고 나빴다면 경험이다.
    Baeg-won
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 🍃 Spring, Spring Boot
        • 스프링 프레임워크 기초
        • 스프링 핵심 원리 - 기본편
        • 자바 ORM 표준 JPA 프로그래밍 - 기본편
        • 스프링 MVC
        • 실전! 스프링 부트와 JPA 활용1 - 웹 애플리..
      • 🥑 Web Technoloy
      • 🚗 Backend Toy Project
        • 스프링 부트 게시판
        • Photogram
        • Baeg-won Clothing Gallery
      • 🥇 Problem Solving
        • Breadth-First Search
        • Depth-First Search
        • Backtracking
        • Simulation
        • Two-pointer
        • Binary Search
        • Greedy
        • Dynamic Programming
        • Minimum Spanning Tree
        • Dijkstra
        • Floyd warshall
      • ☕ Java
        • 명품 자바 에센셜
        • Applications
      • 🍦 JavaScript
        • JavaScript 기초
      • 🐧 Linux
        • 이것이 리눅스다(CentOS 8)
      • 📟 Database
        • 혼자 공부하는 SQL
      • 🧬 Data Structure
      • 🎬 HTML
      • 🎤 Tech Interview
      • 📌 etc
        • Unity 2D Raising Jelly Game
        • C++
        • 영어 쉐도잉
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Baeg-won
[Python] BOJ / 1062번 / 가르침
상단으로

티스토리툴바