[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)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

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

티스토리툴바