[BOJ] 25327번: 다중 항목 선호도 조사(Large)

2023. 2. 16. 10:50·Problem Solving/Baekjoon

출처 : https://www.acmicpc.net/problem/25327

 

25327번: 다중 항목 선호도 조사 (Large)

n명의 학생에게 다음과 같이 선호도를 조사하였다. 각 학생은 아래 세 가지 조사 항목 각각에 대하여 반드시 1가지를 선택해야 한다. 좋아하는 과목(subject)에 'kor', 'eng', 'math' 중 하나를 선택 좋아

www.acmicpc.net

 

 

 

1. 문제 설명 

n(n명의 학생)이 주어진다. 각 학생은 세 가지 항목 각각에 대해 반드시 1가지를 선택한다.

 

n명 학생의 선호도에 대하여 m개의 질의를 순서대로 처리한다. 

  • 질의 형식은 'subject fruit color'이다.
  • subject은 'kor', 'eng', 'math', '-' 중 하나이다.
  • fruit은 'apple', 'pear', 'orange', '-' 중 하나이다.
  • color는 'red', 'blue', 'green', '-' 중 하나이다.
  • '-' 표시는 해당 조건을 고려하지 않겠다는 의미이다.
  • n명 학생 중 선호도가 subject fruit color와 일치하는 학생 수를 출력한다.

n명 학생의 선호도와 m개의 질의가 주어지면, m개의 질의를 순서대로 출력하자.

 

 

 


2. 접근 방식 

처음에 접근한 방식은 브루트포스였다. 각 질의에 따라 n명의 학생의 선호도를 모두 살펴보는 방식이였는데, 어김없이 시간 초과가 났다. 사실 그 이후로 문제를 어떻게 접근해야 할 지 떠오르지가 않았다. 고수님들의 도움을 받아 미리 전처리를 해주라는 힌트를 얻었다. (그래도 이해하지 못했다... 나는 문어.. 꿈을 꾸는 문어) 오랜 시간 고민 끝에 n명의 학생의 선호도에 대한 모든 경우의 수를 만들어주고, 각 학생의 선호도를 입력받아서 해당 경우의 수에 1을 더해준다. (해당 경우의 수가 존재한다.) 그리고 m개의 질의에 대해서 처리해줬다. m개의 질의 중에서 '-'가 존재하는 항목이 있다면(해당 조건을 고려하지 않는다. 즉, 어떤 항목을 고르던 상관없다.)  해당 항목에 대한 모든 경우의 수를 더해준다. 

 

ex) 

각 학생의 선호도 중에서 eng - -,  kor apple red, kor pear - 가 존재하고 kor - - 라는 질의가 존재한다고 가정한다면 해당 질의와 일치하는 학생은 2명(kor apple red, kor pear -)이다. 

 

 

 


3. 주석 달기 (변수 설명, 각 줄마다 문장으로 설명, 함수 설명)

import sys
input = sys.stdin.readline
n, m = map(int, input().split())
s = ['kor', 'eng', 'math']
f = ['apple', 'pear', 'orange']
v = ['red', 'blue', 'green']
cnt = {}
for i in s:
    for j in f:
        for k in v:
            cnt[(i, j, k)] = 0

for _ in range(n):
    a, b, c = input().split()
    cnt[(a, b, c)] += 1

for _ in range(m):
    a, b, c = input().split()
    ans = 0
    if a == '-':
        a = s
    else:
        a = [a]

    if b == '-':
        b = f
    else:
        b = [b]

    if c == '-':
        c = v
    else:
        c = [c]

    for i in a:
        for j in b:
            for k in c:
                ans += cnt[(i, j, k)]

    print(ans)

 

 


4. 분석 및 시간복잡도 

시간복잡도 : O(N+M) => 10^5 + 10^5 * 27

 

 

'Problem Solving/Baekjoon' 카테고리의 다른 글
  • [BOJ] 13458번: 시험 감독
  • [BOJ] 11723번: 집합
  • [BOJ] 17466번: N! mod P(1)
  • [boj] 14501번: 퇴사
kimdozzi
kimdozzi
끝까지 포기하지 않으면, 내가 다 이겨!
  • kimdozzi
    도브로
    kimdozzi
  • 전체
    오늘
    어제
    • 분류 전체보기 (132)
      • Problem Solving (49)
        • Baekjoon (29)
        • Programmers (0)
        • LeetCode (17)
        • 삼성 유형 (2)
      • Computer Science (27)
        • Operating System (2)
        • Algorithms (13)
        • Network (6)
        • DataBase (6)
      • Backend (33)
        • JavaScript (0)
        • TypeScript (6)
        • Java (7)
        • Spring Boot (7)
        • Spring Security (6)
        • JPA (2)
        • Mybatis (1)
        • Junit5 (1)
        • Redis (3)
      • DevOps (14)
        • Git, Github (5)
        • docker (4)
        • AWS (3)
        • nginx (2)
      • etc (6)
        • IntelliJ (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 티스토리
    • 설정
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Bucket
    python
    도커
    docker image
    구간 업데이트
    티스토리챌린지
    TypeScript
    알고리즘
    누적합
    AWS
    온라인 쿼리
    인덱스 시그니처
    파이썬
    imos법
    타입스크립트
    세그먼트 트리
    segment tree
    백준
    PrefixSum
    인덱서블 타입
    S3
    점 업데이트
    CORS
    docker
    오블완
    삼성기출
    구간합
    컨테이너
    interface
    오프라인 쿼리
    인터페이스
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
kimdozzi
[BOJ] 25327번: 다중 항목 선호도 조사(Large)
상단으로

티스토리툴바