[백준] 9997번: 폰트 - 비트마스킹 Python

2023. 3. 19. 01:25·Algorithm (PS)
728x90

 

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

 

9997번: 폰트

첫째 줄에 단어의 개수 N (1 ≤ N ≤ 25)가 주어진다. 다음 N개 줄에는 사전에 포함되어있는 단어가 주어진다. 단어의 길이는 100을 넘지 않으며, 중복되는 단어는 주어지지 않는다.

www.acmicpc.net

 

* 비트마스킹을 사용할 수 있는 이유 : 알파벳 26자리 방문 표시를 0 or 1 로 할 수 있음 

ex) 1 << 26 을 하면 1을 26자리 왼쪽으로 이동시킬 수 있다

이러면 0의 개수가 26개이며, 0 이 아직 방문되지 않은 알파벳이라는 의미 , 1 은 방문한 알파벳이라는 의미로 사용할 수 있다. 

1 << 26 : 0100 0000 0000 0000 0000 0000 0000

 

1 << 26 - 1 연산을 해주면 1 뒤의 0 들이 1로 바뀌게 된다. 

1 << 26 - 1 : 0011 1111 1111 1111 1111 1111 1111

 

* 각 단어의 알파벳의 정보를 bit로 표현할 수 있다. 

    for c in word:
        # OR 연산하면 알파벳 있는 경우 1로 저장
        word_list[i] |= 1 << ord(c) - 97 # ord('a') 가 97 임

 

| 은 OR 연산으로 1 또는 0 을 만나면 1이 된다. 이는 알파벳을 방문 유무를 처리할 때 사용한다. 

 

apple 에서 이미 a 가 나왔다면 1 + 1 이므로 그대로 1 이고 

p 는 처음 등장하는 것이라면 1 + 0 이므로 1로 표시할 수 있기 때문이다. 

N = int(input()) # 단어 개수
answer = 0
# # 알파벳 26개 모두 포함하는 단어 조합의 개수 찾기

word_list = [0] * N # 각 단어에 대해 알파벳 정보를 0 1 로 저장한다.

for i in range(N):
    word = input()
    for c in word:
        # OR 연산하면 알파벳 있는 경우 1로 저장
        word_list[i] |= 1 << ord(c) - 97 # ord('a') 가 97 임

# check = [0] * 26 # 알파벳 방문 여부 표시
# 1 << 26 : 1을 26자 왼쪽으로 이동시키기 0100 0000 0000 0000 0000 0000 0000
check = (1 << 26) - 1 # 0011 1111 1111 1111 1111 1111 1111 (알파벳 26자리 방문 여부를 저장하기 위해서 비트 사용 )

def solve(index, visited):
    global N, answer
    if index == N-1:
        if visited == check:
            answer += 1
        return
    solve(index+1, visited | word_list[index+1]) # 현재 단어 추가 -> | 는 OR 연산
    solve(index+1, visited)

solve(-1, 0)

print(answer)

 

 

728x90

'Algorithm (PS)' 카테고리의 다른 글

에라토스테네스의 체 (소수판별 알고리즘) Python  (0) 2023.03.22
[백준] 16197번: 두 동전 python (백트래킹/dfs)  (0) 2023.03.20
[백준] 9205번: 맥주 마시면서 걸어가기 Python  (0) 2023.03.11
[백준] 2170번: 선 긋기 Python - 스위핑 알고리즘, 정렬  (0) 2023.03.06
[프로그래머스] 행렬 테두리 회전하기 Python/파이썬  (0) 2023.03.05
'Algorithm (PS)' 카테고리의 다른 글
  • 에라토스테네스의 체 (소수판별 알고리즘) Python
  • [백준] 16197번: 두 동전 python (백트래킹/dfs)
  • [백준] 9205번: 맥주 마시면서 걸어가기 Python
  • [백준] 2170번: 선 긋기 Python - 스위핑 알고리즘, 정렬
minjiwoo
minjiwoo
Data Engineering과 Cloud Native 기술에 대해 Dive Deep 하는 플랫폼 엔지니어가 되는 것을 목표로 하고 있습니다. 경험과 공부한 내용을 기록하며 지속가능한 엔지니어가 되는 것이 꿈입니다.
minjiwoo
minji's engineering note
minjiwoo
전체
오늘
어제
  • 분류 전체보기 (612)
    • Data Engineering (42)
      • Apache Spark (11)
      • Databricks & Delta Lake (9)
      • Airflow (3)
      • SQL (6)
      • Trouble Shooting (2)
      • Hadoop (2)
      • MLOps (1)
    • Cloud Engineering (104)
      • AWS (23)
      • Linux 🐧 (29)
      • Docker 🐳 (21)
      • Kubernetes ⚙️ (20)
      • Ansible (10)
    • Computer Science (87)
      • 네트워크 (9)
      • 운영체제 (25)
      • 정보처리기사 (48)
      • CS 기술 면접 스터디 (3)
    • Programming Languages (27)
      • Python (17)
      • C와 C++ (10)
    • Backend (5)
      • Django (2)
    • 프로젝트 (2)
      • 테크포임팩트 (2)
    • iOS (11)
      • 레이블러리 (2)
    • Algorithm (PS) (275)
      • LeetCode (6)
    • 개발일기 (29)
      • 내돈내산 후기🎮 (3)
      • 개발자 취준생 (4)
      • Today I Learned (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Hi there

인기 글

태그

  • dfs
  • EC2
  • Databricks
  • linux
  • 백준
  • python
  • ansible
  • 클라우드
  • Leetcode
  • 카카오코딩테스트
  • dp
  • 리눅스
  • 빅데이터
  • 알고리즘
  • 운영체제
  • 데이터엔지니어링
  • docker
  • Kubernetes
  • 코딩테스트
  • 쿠버네티스
  • 데이터브릭스
  • AWS
  • 파이썬
  • SPARK
  • Swift
  • BFS
  • 스파크
  • 데이터엔지니어
  • 프로그래머스
  • 백트래킹

최근 댓글

최근 글

hELLO· Designed By정상우.v4.5.2
minjiwoo
[백준] 9997번: 폰트 - 비트마스킹 Python
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.