지우, 민서, 하준 세 친구가 구슬을 차례로 a개, b개, c개 가지고 있다.
세 사람은 아래 차례대로 한 번씩 구슬을 건넨다.
1. 지우가 지금 가진 구슬의 절반을 민서에게 준다.
2. 민서가 지금 가진 구슬의 절반을 하준에게 준다.
3. 하준이 지금 가진 구슬의 절반을 지우에게 준다.
절반은 2로 나눈 몫이고, 나머지는 버린다(7개의 절반은 3개, 1개의 절반은 0개).
"지금 가진" 구슬은 앞 차례에서 받은 구슬까지 센 수다.
한 줄에 a, b, c가 빈칸 하나씩 띄워 주어진다.
세 번 건넨 뒤 지우, 민서, 하준이 가진 구슬 수를 이 차례대로 빈칸 하나씩 띄워 한 줄에 출력하라.
입력
0 ≤ a, b, c ≤ 1,000,000(정수)
출력
한 줄에 지우, 민서, 하준의 구슬 수(정수 세 개)
예시 1 · stdin
7 2 5
stdout
7 3 4
예시 2 · stdin
10 0 0
stdout
6 3 1
main.py
오류 목록00F8 ↓ · ⇧F8 ↑
입력(stdin)
실행하면 이 줄들이 차례로 input()·표준 입력으로 들어가요(실행 중에 묻지 않아요).
$ 준비됐어요
코드를 입력해 풀려면 PC에서 열어 주세요. 모바일에서는 문제와 풀이를 볼 수 있어요.
다른 언어로는?언어별 풀이 보기 · 8개 언어 풀이
건넬 몫을 먼저 새 변수에 담아 두는 것이 핵심이에요. a = a - a / 2; b = b + a / 2;처럼 몫을 두 번 계산하면 둘째 줄의 a는 이미 줄어든 값이라, 7개에서 3개를 빼고 민서에게는 4의 절반인 2개만 줘요. 그래서 give = a / 2처럼 변수를 하나 만들어 빼는 쪽과 더하는 쪽에 같은 값을 써요. 변수를 만드는 법은 언어마다 달라요. Python과 크레이콘은 give = …처럼 처음 값을 넣는 순간 변수가 생겨요(크레이콘 준다 = 수학.몫(a, 2);). JS·TS는 const give = …로 만들고, 다시 넣을 변수는 let으로 만들어요. TS는 const give: number처럼 타입을 붙일 수도 있어요. Java·C·C++는 int give = a / 2;처럼 타입을 앞에 쓰고, C#은 var give, C++는 auto give로 오른쪽 값에서 타입을 정하게 할 수도 있어요. 둘째 함정은 절반을 구하는 나눗셈이에요. C·C++·Java·C#의 int /는 몫만 남지만, Python은 //, JS·TS는 Math.floor(a / 2), 크레이콘은 수학.몫(a, 2)를 써야 해요. JS·TS·크레이콘의 /는 7 / 2를 3.5로 계산해요. 셋째, 세 사람의 몫을 모두 처음 값으로 계산하면 안 돼요. 민서와 하준은 앞에서 받은 구슬까지 센 수의 절반을 줘요. 값은 모두 합쳐도 300만이라 int로 충분해요.
Pythonmain.py · 16 줄
a, b, c = map(int, input().split())# 건넬 몫을 먼저 새 변수에 담아 두고, 주는 쪽과 받는 쪽에 같은 값을 쓴다give = a // 2a -= giveb += givegive = b // 2 # 민서는 방금 받은 구슬까지 센 수의 절반을 준다b -= givec += givegive = c // 2c -= givea += giveprint(a, b, c)
JavaScriptmain.js · 16 줄
let [a, b, c] = require("fs").readFileSync(0, "utf8").trim().split(/\s+/).map(Number);// 건넬 몫은 const로 한 번 만들고 두 번 쓴다(JS의 /는 소수까지 나누니 Math.floor)const give1 = Math.floor(a / 2);a -= give1;b += give1;const give2 = Math.floor(b / 2);b -= give2;c += give2;const give3 = Math.floor(c / 2);c -= give3;a += give3;console.log(`${a} ${b} ${c}`);
import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int a = sc.nextInt(); int b = sc.nextInt(); int c = sc.nextInt(); // int끼리 /는 몫만 남는다 int give = a / 2; a -= give; b += give; give = b / 2; b -= give; c += give; give = c / 2; c -= give; a += give; System.out.println(a + " " + b + " " + c); }}
C#Main.cs · 26 줄
using System;class Program{ static void Main() { string[] p = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries); int a = int.Parse(p[0]); int b = int.Parse(p[1]); int c = int.Parse(p[2]); var give = a / 2; // var는 오른쪽을 보고 int로 정한다 a -= give; b += give; give = b / 2; b -= give; c += give; give = c / 2; c -= give; a += give; Console.WriteLine($"{a} {b} {c}"); }}
C++main.cpp · 20 줄
#include <iostream>int main() { int a, b, c; std::cin >> a >> b >> c; auto give = a / 2; // auto는 오른쪽을 보고 int로 정한다 a -= give; b += give; give = b / 2; b -= give; c += give; give = c / 2; c -= give; a += give; std::cout << a << " " << b << " " << c << "\n";}
Cmain.c · 21 줄
#include <stdio.h>int main(void) { int a, b, c; scanf("%d %d %d", &a, &b, &c); int give = a / 2; /* 건넬 몫을 먼저 담아 둔다 */ a -= give; b += give; give = b / 2; b -= give; c += give; give = c / 2; c -= give; a += give; printf("%d %d %d\n", a, b, c); return 0;}
Craykonmain.cray · 19 줄
p = 콘솔.줄읽기().공백제거().나누기(" ");a = p[0].수로변환();b = p[1].수로변환();c = p[2].수로변환();// 크레이콘은 처음 넣는 순간 변수가 생긴다. /는 소수까지 나누니 수학.몫준다 = 수학.몫(a, 2);a = a - 준다;b = b + 준다;준다 = 수학.몫(b, 2);b = b - 준다;c = c + 준다;준다 = 수학.몫(c, 2);c = c - 준다;a = a + 준다;콘솔.쓰기(a + " " + b + " " + c);