[카카오] 양궁대회 Python/BFS

2022. 9. 27. 18:38·Algorithm (PS)
728x90


https://school.programmers.co.kr/learn/courses/30/lessons/92342

양궁을 어떻게 쏠지 여러가지 경우가 나올 텐데 이를 queue에 저장했다가 
bfs내에서 현재 과녘을 라이언이 쏘는 경우와 쏘지 않는 경우 각각을 모두 queue에 push 해주었다 . -> 이 방법을 통해서 과녘을 쏘는 경우의 수들을 탐색하고, while문이 종료되는 조건들을 통해서 max_gap을 갱신한다. 

queue = deque([(0, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])])  # count, arrow

queue에 현재 과녘과 화살을 쏜 기록인 (count, arrow)를 초기화하여 push한다. 

if sum(arrow) == n:  # while 문 종료
    ryan = 0
    apeach = 0 # 라이언 어피치 점수 계산
    for i in range(11):
        if not (arrow[i] == 0 and info[i] == 0):
            if arrow[i] > info[i]:  # 라이언이 이김
                ryan += 10 - i
            else:
                apeach += 10 - i
    if ryan > apeach:
        gap = ryan - apeach
        if max_gap > gap:
            continue
        if max_gap < gap:
            max_gap = gap
            answer.clear()
        answer.append(arrow)  # 화살 기록 저장하기

n개만큼 화살을 쏜 경우 while문에서 탈출하고 라이언과 어피치의 점수를 계산한다. 
그리고 max_gap을 갱신한다. max_gap이 갱신될 때, answer 배열을 clear()함수를 통해 비운다. 

# programmers https://school.programmers.co.kr/learn/courses/30/lessons/92342
from collections import deque
import copy

def bfs(n, info):
    answer = []
    queue = deque([(0, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])])  # count, arrow
    max_gap = 0  # 라이언 - 어피치 점수 최대 차

    while queue:
        count, arrow = queue.popleft()
        if sum(arrow) == n:  # while 문 종료
            ryan = 0
            apeach = 0 # 라이언 어피치 점수 계산
            for i in range(11):
                if not (arrow[i] == 0 and info[i] == 0):
                    if arrow[i] > info[i]:  # 라이언이 이김
                        ryan += 10 - i
                    else:
                        apeach += 10 - i
            if ryan > apeach:
                gap = ryan - apeach
                if max_gap > gap:
                    continue
                if max_gap < gap:
                    max_gap = gap
                    answer.clear()
                answer.append(arrow)  # 화살 기록 저장하기

        elif sum(arrow) > n: # 화살 더 쏜 경우 -> 무조건적으로 info[count] + 1라고 더해주고 있어서 예외처리 필요
            continue
        elif count == 10:
            temp = arrow.copy()
            temp[count] = n - sum(temp)
            queue.append((-1, temp)) # n = - 1 
        else:
            temp = arrow.copy()
            temp[count] = info[count]+1 # 화살 쏘는 경우 무조건 어피치보다 +1 많이 쏴야 득점
            queue.append((count+1, temp))
            temp2 = arrow.copy()
            temp2[count] = 0 # 안쏘는 경우
            queue.append((count+1, temp2))
    return answer


def solution(n, info):
    result = bfs(n, info)
    if not result:
        return [-1]
    elif len(result) == 1: # case가 하나밖에 없을 때
        return result[0]
    else: # 과녘 점수 작은것들을 최대한 많이 포함하는 경우 (bfs에서 인덱스 오름차순으로 돌리기 때문에 뒤에 가있)
        return result[-1]
728x90

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

[백준] 20056 마법사 상어와 파이어볼 Python  (0) 2022.09.28
[정보처리기사/실기] 웹 서버(Web Server)의 기능  (0) 2022.09.27
[백준] 1717 집합의 표현 Python - union-find 알고리즘  (0) 2022.09.27
[카카오] 파괴되지 않은 건물 Python/DP/누적합  (0) 2022.09.26
[카카오] 성격 유형 검사하기 Python 풀이  (0) 2022.09.26
'Algorithm (PS)' 카테고리의 다른 글
  • [백준] 20056 마법사 상어와 파이어볼 Python
  • [정보처리기사/실기] 웹 서버(Web Server)의 기능
  • [백준] 1717 집합의 표현 Python - union-find 알고리즘
  • [카카오] 파괴되지 않은 건물 Python/DP/누적합
minjiwoo
minjiwoo
Data Engineering과 Cloud Native 기술에 대해 Dive Deep 하는 플랫폼 엔지니어가 되는 것을 목표로 하고 있습니다. 경험과 공부한 내용을 기록하며 지속가능한 엔지니어가 되는 것이 꿈입니다.
minji's engineering noteData Engineering과 Cloud Native 기술에 대해 Dive Deep 하는 플랫폼 엔지니어가 되는 것을 목표로 하고 있습니다. 경험과 공부한 내용을 기록하며 지속가능한 엔지니어가 되는 것이 꿈입니다.
minjiwoo
minji's engineering note
minjiwoo
전체
오늘
어제
  • 분류 전체보기 (613)
    • 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)
    • 개발일기 (30)
      • 내돈내산 후기🎮 (3)
      • 개발자 취준생 (5)
      • Today I Learned (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Hi there

인기 글

태그

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

최근 댓글

최근 글

hELLO· Designed By정상우.v4.5.2
minjiwoo
[카카오] 양궁대회 Python/BFS
상단으로

티스토리툴바

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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