피로그래밍코딩테스트

맨큐의 경제학9판·2023년 6월 5일
0

깃헙 레포지토리=https://github.com/woominKO/Pirograming

[문제]

19기 코딩 테스트 문제

컴퓨터가 되어버린 운영진을 이겨라!

피로그래밍 운영진 카드 게임

2개월 간의 혹독하지만 보람찬 세션과 과제들을 완수하며 **코딩 지옥🔥**에 빠져버린 피로그래밍 운영진들…

운영진과의 카드 게임에서 1등을 해야 코딩 지옥에서 벗어날 수 있다는데..😨

제시된 출력 형태를 참고하여 아래의 조건들을 만족하는 프로그램을 구현해 운영진을 구해주세요🥺✨

출력 형태를 바탕으로 아래의 조건들에 맞게 프로그램을 구현하시오.

문제설명

[ 게임 시작 전 ]

  • 캐릭터가 총 4명 존재한다.
캐릭터 표박신빈윤정원임담희김용현
  • 사용자는 4개의 캐릭터 중 하나를 자신의 캐릭터로 선택한다. - 선택방식은 자유
  • 이때 선택된 캐릭터는 게임이 끝날 때까지 바뀌지 않는다.
  • 컴퓨터가 1부터 13 사이의 숫자 카드를 랜덤으로 30장 생성한다. (중복 가능)
  • 내 캐릭터 포함 네 명의 플레이어들은 돌아가며 덱의 맨 뒤부터 카드를 뽑는다.
    • 1라운드는 이름 순 2,3,4 라운드는 점수가 낮은 순서대로 카드를 뽑는다.
    • 문서 마지막의 입출력 케이스를 참고하시면 이해가 쉽습니다.

[ 게임 진행 ]

  • 게임은 4 라운드 동안 진행된다.
  • 매 라운드의 시작마다 카드 덱을 섞는다.
  • 내 캐릭터 포함 네 명의 플레이어들은 돌아가며 덱의 맨 뒤부터 카드를 뽑는다.
  • 모든 사람이 카드를 뽑은 후 해당 라운드에서 가장 숫자가 큰 카드를 뽑은 플레이어가 승리하며, 승리한 플레이어는 가장 낮은 숫자의 카드를 뽑은 플레이어의 카드 숫자와의 차이만큼 점수를 얻는다.
    • 가장 숫자가 큰 카드를 뽑은 사람이 여러 명일 경우 해당되는 모든 플레이어가 점수를 얻는다.
    • 이때 모든 사람이 카드가 동일한 경우 결론적으로 모든 0점을 얻게 된다.
  • 플레이어가(내 캐릭터, 컴퓨터 공통) 카드를 선택할 때마다 어떤 카드를 뽑았는지 출력한다.
    카드를 모두 뽑은 후 승리한 플레이어가 얻을 점수를 구해서 출력한다.
  • 각 라운드가 종료되었을 때 업데이트된 플레이어의 점수를 표시.

[ 게임 종료 후 ]

  • 4라운드 동안 진행되며, 4라운드 종료 후 게임 결과를 출력한다.
    • 먼저 라운드에서 승리한 횟수 순서, 점수 순서 두가지 형태로 각각 출력한다.
      단, 승리한 횟수나 점수가 같을 경우 이름 순으로 출력한다.
    • 결과 출력 상에서 내가 선택한 캐릭터는 이름 앞뒤에 * 를 출력해준다.

HINT

  • 카드를 무작위로 뽑거나 섞을 때는 random 함수를 사용해보세요.

  • 정렬할 때에는 sort, lambda 함수를 사용해보세요.

  • 어디서부터 공부해야할지 모르겠다면, 아래 링크에 들어가보세요!

    스켈레톤 코드

  • 스켈레톤 코드는 참고사항일 뿐입니다.

  • 스켈레톤 코드를 사용하지 않아도 좋습니다.

  • 사용하실 분들은 TODO 로 표시 되어있는 부분을 참고해주세요.

  • 자유롭게 조건에 맞는 프로그램을 구현해주세요.

import random

class Player:
    def __init__(self, name):
        self.name = name
        self.score = 0
        self.round_wins = 0
    
    def __str__(self) -> str:
        return f"{self.name}"

class Game:
    def __init__(self):
        self.players = [] # 유저들의 목록
        self.deck = [] # 카드 무작위 생성
        self.my_player = ""

    def start_game(self):
        """
        - [ 게임 시작 전 ] 부분을 담당하는 함수 입니다.
        - 캐릭터들을 초기화 하고, 사용자가 플레이할 캐릭터를 선택합니다.
        - 1부터 13사이의 숫자의 무작위 숫자를 골라서 30개의 카드로 이루어진 덱을 만듭니다.
        - 동일 클래스의 game()에서 호출됩니다.
        """

        self.players.append(Player("박신빈"))
        self.players.append(Player("윤정원"))
        self.players.append(Player("임담희"))
        self.players.append(Player("김용현"))

        print("당신의 캐릭터 번호를 선택해주세요 (1,2,3,4) :", end = "")
        # TODO 1-(1): 사용자로부터 캐릭터를 입력받아 my_player에 저장해주세요.
        # Write code here..
        ##### END OF TODO 1-(1)(문제와 본 라인 사이에 코드를 작성하세요.) #####
        
        # TODO 1-(2) : 랜덤으로 1부터 13 사이의 카드 30장을 deck에 저장해주세요
        # random에 대한 함수를 공부해봅시다.
        # Write code here..
        ##### END OF TODO 1-(2)(문제와 본 라인 사이에 코드를 작성하세요.) #####

    def set_play_order(self, round_num):
        """ 
        - [ 게임 진행 ] 부분에서 게임진행 순서를 정하는 함수 입니다.
        - 동일 클래스의 play_game()에서 호출됩니다.
        """
        # TODO 2 : 게임진행을 위한 플레이어를 재정렬해주세요.(ROUND 1 : 사전 순서로 이름을 오름차순으로 정렬, ROUND 2,3,4 : 점수를 기준으로 오름차순 정렬)
        # sort 와 lambda 함수에 대해 공부해보세요. 사용하지 않아도 좋습니다.
        # Write code here..
        ##### END OF TODO 2 (문제와 본 라인 사이에 코드를 작성하세요.) #####

    def play_round(self):
        """
        - [ 게임 진행 ] 라운드 진행을 담당하는 함수 입니다.
        - 동일 클래스의 play_game()에서 호출됩니다.
        """
        
        play_order = ",".join(map(str, self.players))

        print(f"게임은 {play_order} 순으로 진행됩니다.\n")

        # TODO 3-(1) : 카드를 뽑기 전에 self.deck을 랜덤으로 섞어주셔요.
        # Write code here..
        ##### END OF TODO 3-(1) (문제와 본 라인 사이에 코드를 작성하세요.) #####

        print("===========플레이어가 뽑은 카드============")
        # TODO 3-(2) : 플레이어들이 카드를 뽑는 부분입니다. 플레이어들이 뽑은 카드를 players_cards에 저장해주시고, 뽑을 때마다 어떠한 카드를 뽑았는지 출력하는 코드를 작성해주세요. 
        # Write code here..
        ##### END OF TODO 3-(2) (문제와 본 라인 사이에 코드를 작성하세요.) ##### 
        
        # TODO 3-(3) : 가장 큰 숫자를 뽑은 플레이어가 점수를 얻는 코드를 작성해주세요.
        # 점수 계산 방식 : 본인의 카드에 적힌 숫자 - 플레이어들이 뽑은 카드 중 가장 숫자가 작은 카드에 적힌 숫자
        # Write code here..
        ##### END OF TODO 3-(3) (문제와 본 라인 사이에 코드를 작성하세요.) ##### 

    def play_game(self):
        
        """
        - [ 게임 진행 ] 부분을 담당하는 함수 입니다.
        - 동일 클래스의 game()에서 호출됩니다.
        """
        for round_num in range(1, 5):

          self.set_play_order(round_num)

          print("===========================")
          print(f"     ROUND {round_num} - START")
          print("===========================")
          self.play_round()

          
          print("===========================")
          print(f"     ROUND {round_num} - END")
          print("===========================")
          # 라운드 종료 후 각 플레이어들의 현재 점수
          for order, player in enumerate(self.players, 1): 
            print(f"{order}. {player} : {player.score}점")
          print()
    
    def game_result(self):
        
        # TODO 4-(1) : 점수 순으로 결과값을 출력해주세요.
        # 내가 선택한 캐릭터 이름 앞뒤에는 *을 붙여주세요.
        # sort 와 lambda 함수에 대해 공부해보세요. 사용하지 않아도 좋습니다.
        print("=============================")
        print("     게임 순위 - 점수")
        print("=============================")
        # Write code here..
        ##### END OF TODO 4-(1)(문제와 본 라인 사이에 코드를 작성하세요.) #####
        
  
        # TODO 4-(2) : 승리 횟수 순으로 결과값을 출력해주세요.
        # 내가 선택한 캐릭터 이름 앞뒤에는 *을 붙여주세요.
        # sort 와 lambda 함수에 대해 공부해보세요. 사용하지 않아도 좋습니다.
        print("=============================")
        print("     게임 순위 - 승리 횟수")
        print("=============================")
        # Write code here..
        ##### END OF TODO 4-(2)(문제와 본 라인 사이에 코드를 작성하세요.) #####

          
    def game(self):
        
        """
        - 게임 운영을 위한 함수입니다. 
        - 별도의 코드 작성이 필요 없습니다. 
        """

        self.start_game()
        self.play_game()
        self.game_result()

if __name__ == "__main__":  
    """
    - 코드를 실행하는 부분입니다. 
    - 역시 별도의 코드 작성이 필요 없습니다. 
    """
    game = Game()

    game.game()

TODO list

  • TODO List 1-1. 번호 입력 받아 해당 캐릭터 my_player에 저장하기 1-2. 1부터 13 사이의 숫자 카드를 랜덤으로 30장 생성해서 deck에 저장하기
    1. 플레이어 순서 정렬 (1R: 이름 순, 2R ~: 점수 낮은 순)

      3-1. 카드를 뽑기 전에 deck을 랜덤으로 섞기

      3-2. 플레이어별로 카드를 deck의 뒤에서부터 뽑고 출력하기

      3-3. 라운드 종료 후 플레이어별로 점수 계산해서 업데이트 후 출력하기

      4-1. 점수 순으로 결과값 출력하기

      ⇒ 점수가 같다면 이름순 출력

      4-2. 게임 종료 후 승리 횟수 순으로 결과값 출력하기

      ⇒ 승리 횟수가 같다면 이름순 출력

입출력케이스

  • 이해에 도움을 드리기 위한 다양한 입출력케이스입니다.
  • 입출력 예시 1 입력형태 1 당신의 캐릭터 번호를 선택해주세요 (1,2,3,4) : 4 출력형태 1
    ===========================
         ROUND 1 - START
    ===========================
    게임은 김용현,박신빈,윤정원,임담희 순으로 진행됩니다.
    
    ===========플레이어가 뽑은 카드============
    >> 김용현 (현재 점수: 0)
    >> 뽑은 카드: 5
    
    >> 박신빈 (현재 점수: 0)
    >> 뽑은 카드: 11
    
    >> 윤정원 (현재 점수: 0)
    >> 뽑은 카드: 6
    
    >> 임담희 (현재 점수: 0)
    >> 뽑은 카드: 2
    
    >>>> 박신빈님이 9 점을 얻었습니다 \^_^/ <<<<
    
    ===========================
         ROUND 1 - END
    ===========================
    1. 김용현 : 02. 박신빈 : 93. 윤정원 : 04. 임담희 : 0===========================
         ROUND 2 - START
    ===========================
    게임은 김용현,윤정원,임담희,박신빈 순으로 진행됩니다.
    
    ===========플레이어가 뽑은 카드============
    >> 김용현 (현재 점수: 0)
    >> 뽑은 카드: 9
    
    >> 윤정원 (현재 점수: 0)
    >> 뽑은 카드: 10
    
    >> 임담희 (현재 점수: 0)
    >> 뽑은 카드: 8
    
    >> 박신빈 (현재 점수: 9)
    >> 뽑은 카드: 4
    
    >>>> 윤정원님이 6 점을 얻었습니다 \^_^/ <<<<
    
    ===========================
         ROUND 2 - END
    ===========================
    1. 김용현 : 02. 윤정원 : 63. 임담희 : 04. 박신빈 : 9===========================
         ROUND 3 - START
    ===========================
    게임은 김용현,임담희,윤정원,박신빈 순으로 진행됩니다.
    
    ===========플레이어가 뽑은 카드============
    >> 김용현 (현재 점수: 0)
    >> 뽑은 카드: 12
    
    >> 임담희 (현재 점수: 0)
    >> 뽑은 카드: 5
    
    >> 윤정원 (현재 점수: 6)
    >> 뽑은 카드: 7
    
    >> 박신빈 (현재 점수: 9)
    >> 뽑은 카드: 3
    
    >>>> 김용현님이 9 점을 얻었습니다 \^_^/ <<<<
    
    ===========================
         ROUND 3 - END
    ===========================
    1. 김용현 : 92. 임담희 : 03. 윤정원 : 64. 박신빈 : 9===========================
         ROUND 4 - START
    ===========================
    게임은 임담희,윤정원,김용현,박신빈 순으로 진행됩니다.
    
    ===========플레이어가 뽑은 카드============
    >> 임담희 (현재 점수: 0)
    >> 뽑은 카드: 12
    
    >> 윤정원 (현재 점수: 6)
    >> 뽑은 카드: 3
    
    >> 김용현 (현재 점수: 9)
    >> 뽑은 카드: 11
    
    >> 박신빈 (현재 점수: 9)
    >> 뽑은 카드: 7
    
    >>>> 임담희님이 9 점을 얻었습니다 \^_^/ <<<<
    
    ===========================
         ROUND 4 - END
    ===========================
    1. 임담희 : 92. 윤정원 : 63. 김용현 : 94. 박신빈 : 9=============================
         게임 순위 - 점수
    =============================
    1- *김용현* : 92- 박신빈 : 93- 임담희 : 94- 윤정원 : 6=============================
         게임 순위 - 승리 횟수
    =============================
    1- *김용현* : 12- 박신빈 : 13- 윤정원 : 14- 임담희 : 1
  • 입출력 예시 2 입력형태 2 당신의 캐릭터 번호를 선택해주세요 (1,2,3,4) : 3 출력형태 2
    ===========================
         ROUND 1 - START
    ===========================
    게임은 김용현,박신빈,윤정원,임담희 순으로 진행됩니다.
    
    ===========플레이어가 뽑은 카드============
    >> 김용현 (현재 점수: 0)
    >> 뽑은 카드: 3
    
    >> 박신빈 (현재 점수: 0)
    >> 뽑은 카드: 10
    
    >> 윤정원 (현재 점수: 0)
    >> 뽑은 카드: 8
    
    >> 임담희 (현재 점수: 0)
    >> 뽑은 카드: 3
    
    >>>> 박신빈님이 7 점을 얻었습니다 \^_^/ <<<<
    
    ===========================
         ROUND 1 - END
    ===========================
    1. 김용현 : 02. 박신빈 : 73. 윤정원 : 04. 임담희 : 0===========================
         ROUND 2 - START
    ===========================
    게임은 김용현,윤정원,임담희,박신빈 순으로 진행됩니다.
    
    ===========플레이어가 뽑은 카드============
    >> 김용현 (현재 점수: 0)
    >> 뽑은 카드: 11
    
    >> 윤정원 (현재 점수: 0)
    >> 뽑은 카드: 7
    
    >> 임담희 (현재 점수: 0)
    >> 뽑은 카드: 2
    
    >> 박신빈 (현재 점수: 7)
    >> 뽑은 카드: 4
    
    >>>> 김용현님이 9 점을 얻었습니다 \^_^/ <<<<
    
    ===========================
         ROUND 2 - END
    ===========================
    1. 김용현 : 92. 윤정원 : 03. 임담희 : 04. 박신빈 : 7===========================
         ROUND 3 - START
    ===========================
    게임은 윤정원,임담희,박신빈,김용현 순으로 진행됩니다.
    
    ===========플레이어가 뽑은 카드============
    >> 윤정원 (현재 점수: 0)
    >> 뽑은 카드: 1
    
    >> 임담희 (현재 점수: 0)
    >> 뽑은 카드: 11
    
    >> 박신빈 (현재 점수: 7)
    >> 뽑은 카드: 10
    
    >> 김용현 (현재 점수: 9)
    >> 뽑은 카드: 7
    
    >>>> 임담희님이 10 점을 얻었습니다 \^_^/ <<<<
    
    ===========================
         ROUND 3 - END
    ===========================
    1. 윤정원 : 02. 임담희 : 103. 박신빈 : 74. 김용현 : 9===========================
         ROUND 4 - START
    ===========================
    게임은 윤정원,박신빈,김용현,임담희 순으로 진행됩니다.
    
    ===========플레이어가 뽑은 카드============
    >> 윤정원 (현재 점수: 0)
    >> 뽑은 카드: 8
    
    >> 박신빈 (현재 점수: 7)
    >> 뽑은 카드: 2
    
    >> 김용현 (현재 점수: 9)
    >> 뽑은 카드: 9
    
    >> 임담희 (현재 점수: 10)
    >> 뽑은 카드: 7
    
    >>>> 김용현님이 7 점을 얻었습니다 \^_^/ <<<<
    
    ===========================
         ROUND 4 - END
    ===========================
    1. 윤정원 : 02. 박신빈 : 73. 김용현 : 164. 임담희 : 10=============================
         게임 순위 - 점수
    =============================
    1- 김용현 : 162- *임담희* : 103- 박신빈 : 74- 윤정원 : 0=============================
         게임 순위 - 승리 횟수
    =============================
    1- 김용현 : 22- 박신빈 : 13- *임담희* : 14- 윤정원 : 0
  • 입출력 예시 3 입력형태 3 당신의 캐릭터 번호를 선택해주세요 (1,2,3,4) : 4 출력형태 3
    ===========================
         ROUND 1 - START
    ===========================
    게임은 김용현,박신빈,윤정원,임담희 순으로 진행됩니다.
    
    ===========플레이어가 뽑은 카드============
    >> 김용현 (현재 점수: 0)
    >> 뽑은 카드: 13
    
    >> 박신빈 (현재 점수: 0)
    >> 뽑은 카드: 7
    
    >> 윤정원 (현재 점수: 0)
    >> 뽑은 카드: 8
    
    >> 임담희 (현재 점수: 0)
    >> 뽑은 카드: 8
    
    >>>> 김용현님이 6 점을 얻었습니다 \^_^/ <<<<
    
    ===========================
         ROUND 1 - END
    ===========================
    1. 김용현 : 62. 박신빈 : 03. 윤정원 : 04. 임담희 : 0===========================
         ROUND 2 - START
    ===========================
    게임은 박신빈,윤정원,임담희,김용현 순으로 진행됩니다.
    
    ===========플레이어가 뽑은 카드============
    >> 박신빈 (현재 점수: 0)
    >> 뽑은 카드: 13
    
    >> 윤정원 (현재 점수: 0)
    >> 뽑은 카드: 10
    
    >> 임담희 (현재 점수: 0)
    >> 뽑은 카드: 4
    
    >> 김용현 (현재 점수: 6)
    >> 뽑은 카드: 2
    
    >>>> 박신빈님이 11 점을 얻었습니다 \^_^/ <<<<
    
    ===========================
         ROUND 2 - END
    ===========================
    1. 박신빈 : 112. 윤정원 : 03. 임담희 : 04. 김용현 : 6===========================
         ROUND 3 - START
    ===========================
    게임은 윤정원,임담희,김용현,박신빈 순으로 진행됩니다.
    
    ===========플레이어가 뽑은 카드============
    >> 윤정원 (현재 점수: 0)
    >> 뽑은 카드: 2
    
    >> 임담희 (현재 점수: 0)
    >> 뽑은 카드: 9
    
    >> 김용현 (현재 점수: 6)
    >> 뽑은 카드: 5
    
    >> 박신빈 (현재 점수: 11)
    >> 뽑은 카드: 6
    
    >>>> 임담희님이 7 점을 얻었습니다 \^_^/ <<<<
    
    ===========================
         ROUND 3 - END
    ===========================
    1. 윤정원 : 02. 임담희 : 73. 김용현 : 64. 박신빈 : 11===========================
         ROUND 4 - START
    ===========================
    게임은 윤정원,김용현,임담희,박신빈 순으로 진행됩니다.
    
    ===========플레이어가 뽑은 카드============
    >> 윤정원 (현재 점수: 0)
    >> 뽑은 카드: 1
    
    >> 김용현 (현재 점수: 6)
    >> 뽑은 카드: 6
    
    >> 임담희 (현재 점수: 7)
    >> 뽑은 카드: 5
    
    >> 박신빈 (현재 점수: 11)
    >> 뽑은 카드: 11
    
    >>>> 박신빈님이 10 점을 얻었습니다 \^_^/ <<<<
    
    ===========================
         ROUND 4 - END
    ===========================
    1. 윤정원 : 02. 김용현 : 63. 임담희 : 74. 박신빈 : 21=============================
         게임 순위 - 점수
    =============================
    1- 박신빈 : 212- 임담희 : 73- *김용현* : 64- 윤정원 : 0=============================
         게임 순위 - 승리 횟수
    =============================
    1- 박신빈 : 22- *김용현* : 13- 임담희 : 14- 윤정원 : 0

코드 로직


파이썬 잘 못하는데 재미있었다.

추가로 공부해야할 부분들

1)람다 함수,sorted: 인터넷에 올라온데로 막 썼는데 정확한 동작원리를 모르겠다.


        if round_num == 1:
            self.players = sorted(self.players, key=lambda x: x.name)
        elif round_num > 1:
            self.players = sorted(self.players, key=lambda x: x.score)

2) for문 enumerate가 뭔지

 for i, player in enumerate(self.players):
            if self.deck[-(i+1)] == MaxCard:
                MaxPlayer = player
                MaxPlayer.score += MaxCard - MinCard
                MaxPlayer.round_wins += 1

3)

def __str__(self) -> str:
        return f"{self.name}"

def __repr__(self):
        return f"{self.name}"

4)

if __name__ == "__main__":
    """
    - 코드를 실행하는 부분입니다. 
    - 역시 별도의 코드 작성이 필요 없습니다. 
    """
    game = Game()

    game.game()

5)

play_order = ",".join(map(str, self.players))
profile
맨큐의 개발일지

0개의 댓글

관련 채용 정보