본문 바로가기
Programming/Contest

[KOI] 카드놀이

by NAMP 2013. 11. 8.


사이트에서 본 초등부 문제를 풀어본다.



###
package main 

import (
	"os"
	"bufio"
	"strings"
	"fmt"
)

func main() {
	// read file
	var inFile = "input.txt"
	file, err := os.Open(inFile)
	
	if err != nil{
		panic(err)
	}
	
	scanner := bufio.NewScanner(file)
	
	scanner.Scan()
	scoreA := strings.Split(scanner.Text(), " ")
	fmt.Printf("%q\n",scoreA)
	
	scanner.Scan()
	scoresB := strings.Split(scanner.Text(), " ")
	fmt.Printf("%q\n",scoresB)
	
	var totA, totB int
	var winner string
	var result = make([]string, len(scoreA))
	
	for idx := range scoreA{
		if scoreA[idx] > scoresB[idx] {
			totA += 3
			result[idx] = "A"
			winner = "A"
		} else if scoreA[idx] < scoresB[idx] {
			totB += 3
			result[idx] = "B"
			winner = "B"
		} else {
			totA += 1
			totB += 1
			result[idx] = "*"
		}
	}
	
	fmt.Printf("%q\n",result)
	fmt.Printf("Total Count A:[%d], B:[%d]\n", totA, totB)
	
	// print winner side
	if winner == "" {println("Draw")
	} else {fmt.Printf("Winner is %s" , winner)}
	
}

###








 카드놀이

  0부터 9까지의 숫자가 표시된 카드를 가지고 두 사람 A와 B가 게임을 한다. A와 B에게는 각각 0에서 9까지의 숫자가 하나씩 표시된 10장의 카드뭉치가 주어진다. 두 사람은 카드를 임의의 순서로 섞은 후 숫자가 보이지 않게 일렬로 늘어  놓고 게임을 시작한다. 단, 게임 도중 카드의 순서를 바꿀 수는 없다.

  A와 B 각각이 늘어놓은 카드를 뒤집어서 표시된 숫자를 확인하는 것을 한 라운드라고 한다. 게임은 첫 번째 놓인 카드부터 시작하여 순서대로 10번의 라운드로 진행된다. 각 라운드에서는 공개된 숫자가 더 큰 사람이 승자가 된다. 승자에게는 승점 3점이 주어지고 패자에게는 승점이 주어지지 않는다. 만약 공개된 두 숫자가 같아서 비기게 되면, A, B 모두에게 승점 1점이 주어진다.

  10번의 라운드가 모두 진행된 후, 총 승점이 큰 사람이 게임의 승자가 된다. 만약, A와 B의 총 승점이 같은 경우에는, 제일 마지막에 이긴 사람을 게임의 승자로 정한다. 그래도 승부가 나지 않는 경우는 모든 라운드에서 비기는 경우뿐이고 이 경우에 두 사람은 비겼다고 한다.

  예를 들어, 다음 표에서 3번째 줄은 각 라운드의 승자를 표시하고 있다. 표에서 D는 무승부를 나타낸다. 이 경우에 A의 총 승점은 16점이고, B는 13점이어서, A가 게임의 승자가 된다.

  
라운드
1
2
3
4
5
6
7
8
9
10
A
4
5
6
7
0
1
2
3
9
8
B
1
2
3
4
5
6
7
8
9
0
A
A
A
A
B
B
B
B
D
A


  아래 표의 경우에는 A와 B의 총 승점은 13점으로 같다. 마지막으로 승부가 난 라운드는 7번째 라운드이고, 이 라운드의 승자인 B가 게임의 승자가 된다.
  
라운드
1
2
3
4
5
6
7
8
9
10
A
9
1
7
2
6
3
0
4
8
5
B
6
3
9
2
1
0
7
4
8
5
A
B
B
D
A
A
B
D
D
D


  A와 B가 늘어놓은 카드의 숫자가 순서대로 주어질 때, 게임의 승자가 A인지 B인지, 또는 비겼는지 결정하는 프로그램을 작성하시오.

  실행 파일의 이름은 AA.EXE로 하고 실행시간은 1초를 넘을 수 없다. 부분 점수는 없다.

입력 형식
  입력 파일의 이름은 INPUT.TXT로 한다. 입력 파일은 두 개의 줄로 이루어진다. 첫 번째 줄에는 A가 늘어놓은 카드의 숫자들이 빈칸을 사이에 두고 순서대로 주어진다. 두 번째 줄에는 B가 늘어놓은 카드의 숫자들이 빈칸을 사이에 두고 순서대로 주어진다.
 
출력 형식
  출력 파일의 이름은 OUTPUT.TXT로 한다. 첫 번째 줄에는 게임이 끝난 후, A와 B가 받은 총 승점을 순서대로 빈칸을 사이에 두고 출력한다. 두 번째 줄에는 이긴 사람이 A인지 B인지 결정해서, 이긴 사람을 문자 A 또는 B로 출력한다. 만약 비기는 경우에는 문자 D를 출력한다.


입력과 출력의 예1
입력(INPUT.TXT)
4 5 6 7 0 1 2 3 9 8
1 2 3 4 5 6 7 8 9 0

출력(OUTPUT.TXT)
16 13
A


입력과 출력의 예2
입력(INPUT.TXT)
9 1 7 2 6 3 0 4 8 5
6 3 9 2 1 0 7 4 8 5

출력(OUTPUT.TXT)
13 13
B


입력과 출력의 예3
입력(INPUT.TXT)
7 1 6 2 3 0 5 9 4 8
7 1 6 2 3 0 5 9 4 8

출력(OUTPUT.TXT)
10 10
D
  








'Programming > Contest' 카테고리의 다른 글

[dovelet] 몫과 나머지 구하기  (0) 2014.08.19
[dovelet] 프로그램 명: area  (0) 2014.08.19
메일이 왔네요. GCJ  (0) 2013.03.31
[GCJ] 2012 Qualification Round  (0) 2012.04.15
GCJ_2012_Registration  (0) 2012.03.14

댓글