{ }codelper
합계P0342

번갈아 던진 다트 점수

지우와 민서가 다트를 한 번씩 번갈아 던진다. 지우가 먼저 던지고, 그다음에 민서가 던지고, 다시 지우가 던지는 순서가 끝까지 이어진다. 첫 줄에 두 사람이 던진 횟수를 모두 합친 n이 주어진다. 둘째 줄에 던질 때마다 얻은 점수 n개가 던진 순서대로 빈칸 하나로 띄워 주어진다. 지우가 얻은 점수의 합과 민서가 얻은 점수의 합을 이 순서대로 빈칸 하나로 띄워 한 줄에 출력하라. n이 1이면 민서는 한 번도 던지지 못했으므로 민서의 합은 0이다.

입력
1 ≤ n ≤ 1,000, 0 ≤ 점수 ≤ 10,000(정수, 쉼표 없이 숫자만 주어진다)
출력
지우의 합과 민서의 합을 빈칸 하나로 띄워 한 줄에
예시 1 · stdin
5
3 7 5 0 10
stdout
18 7
예시 2 · stdin
1
8
stdout
8 0
main.py
입력(stdin)

실행하면 이 줄들이 차례로 input()·표준 입력으로 들어가요(실행 중에 묻지 않아요).

$ 준비됐어요

코드를 입력해 풀려면 PC에서 열어 주세요. 모바일에서는 문제와 풀이를 볼 수 있어요.

다른 언어로는?언어별 풀이 보기 · 8개 언어 풀이

한 칸씩 건너뛰며 더하는 방법이 언어마다 달라요.
Python은 sum(a[0::2])와 sum(a[1::2])처럼 잘라 낸 목록을 바로 더해요.
JS·TS는 a.filter((x, i) => i % 2 === 0).reduce((s, x) => s + x, 0), C#은 a.Where((x, i) => i % 2 == 0).Sum(), Java는 IntStream.range(0, n).filter(i -> i % 2 == 0).map(i -> a[i]).sum()으로 골라서 더해요.
C는 sum[i % 2] += x, C++은 i += 2로 건너뛰는 반복, 크레이콘은 i % 2 == 0인지 보고 두 변수에 나눠 더해요.
함정 하나: JS의 reduce에 시작값 0을 빼먹으면 빈 배열에서 멈춰요.
예시 2에서는 민서의 점수가 하나도 없어서 TypeError(Reduce of empty array with no initial value)가 나요.
Python sum, C# Sum(), Java sum()은 빈 목록에서 0을 줘요.
함정 둘: JS에서 입력을 Number로 바꾸지 않고 더하면 문자열이 이어 붙어요.
예시 1이 18 7이 아니라 03510 070으로 나와요.
크레이콘도 수와 문자열을 +로 더하면 이어 붙이므로, 줄을 통째로 읽었을 때는 수로변환()으로 바꾸거나 콘솔.수들읽기()로 읽어요.
함정 셋: 목록의 번호는 0부터 세므로 지우의 차례가 짝수 번이에요.
차례를 1부터 세면서 짝수 번째를 지우로 삼으면 두 합이 뒤바뀌어 예시 1이 7 18이 돼요.

Pythonmain.py · 4 줄
n = int(input())a = list(map(int, input().split()))# a[0::2]는 0, 2, 4…번, a[1::2]는 1, 3, 5…번. 빈 목록의 sum은 0이다print(sum(a[0::2]), sum(a[1::2]))
JavaScriptmain.js · 5 줄
const [n, ...a] = require("fs").readFileSync(0, "utf8").trim().split(/\s+/).map(Number);// reduce에 시작값 0을 줘야 빈 배열에서도 0이 나온다const jiu = a.filter((x, i) => i % 2 === 0).reduce((s, x) => s + x, 0);const minseo = a.filter((x, i) => i % 2 === 1).reduce((s, x) => s + x, 0);console.log(`${jiu} ${minseo}`);
TypeScriptmain.ts · 6 줄
import { readFileSync } from "node:fs";const [n, ...a]: number[] = readFileSync(0, "utf8").trim().split(/\s+/).map(Number);// reduce에 시작값 0을 줘야 빈 배열에서도 0이 나온다const jiu: number = a.filter((x, i) => i % 2 === 0).reduce((s, x) => s + x, 0);const minseo: number = a.filter((x, i) => i % 2 === 1).reduce((s, x) => s + x, 0);console.log(`${jiu} ${minseo}`);
JavaMain.java · 15 줄
import java.util.Scanner;import java.util.stream.IntStream; public class Main {    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        int n = sc.nextInt();        int[] a = new int[n];        for (int i = 0; i < n; i++) a[i] = sc.nextInt();        // 번호의 흐름에서 짝수 번호만 골라 그 칸의 값을 더한다. 빈 흐름의 sum()은 0이다        int jiu = IntStream.range(0, n).filter(i -> i % 2 == 0).map(i -> a[i]).sum();        int minseo = IntStream.range(0, n).filter(i -> i % 2 == 1).map(i -> a[i]).sum();        System.out.println(jiu + " " + minseo);    }}
C#Main.cs · 15 줄
using System;using System.Linq; class Program{    static void Main()    {        int n = int.Parse(Console.ReadLine());        int[] a = Array.ConvertAll(Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries), int.Parse);        // Where는 (값, 번호)를 함께 받을 수 있다. 빈 목록의 Sum()은 0이다        int jiu = a.Where((x, i) => i % 2 == 0).Sum();        int minseo = a.Where((x, i) => i % 2 == 1).Sum();        Console.WriteLine($"{jiu} {minseo}");    }}
C++main.cpp · 14 줄
#include <iostream>#include <vector> int main() {    int n;    std::cin >> n;    std::vector<int> a(n);    for (int& x : a) std::cin >> x;    int jiu = 0, minseo = 0;    // 두 칸씩 건너뛰며 더한다    for (int i = 0; i < n; i += 2) jiu += a[i];    for (int i = 1; i < n; i += 2) minseo += a[i];    std::cout << jiu << " " << minseo << "\n";}
Cmain.c · 14 줄
#include <stdio.h> int main(void) {    int n;    scanf("%d", &n);    int sum[2] = {0, 0};   /* sum[0]은 지우, sum[1]은 민서 */    for (int i = 0; i < n; i++) {        int x;        scanf("%d", &x);        sum[i % 2] += x;   /* 0번째부터 세면 짝수 번째가 지우다 */    }    printf("%d %d\n", sum[0], sum[1]);    return 0;}
Craykonmain.cray · 17 줄
n = 콘솔.줄읽기().수로변환();a = 콘솔.수들읽기();지우 = 0;민서 = 0;반복 (i = 0; i < n; i++){    // 0번부터 세면 짝수 번이 지우의 차례다    만약 (i % 2 == 0)    {        지우 += a[i];    }    아니면    {        민서 += a[i];    }}콘솔.쓰기(지우 + " " + 민서);