Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- {
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# 스크립트 2018_0930 과제_1\n",
- " \n",
- " 2017136075 이나래"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### **1번) a=\"Hello Python\" 문자열을 Slicing과 연결 연산자 (+)를 사용하여 \"Python Hello\"로 변경하시오.**\n",
- " - [주의] a 변수 자체에 \"Python Hello\" 문자열이 저장되어야 함"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Python Hello\n"
- ]
- }
- ],
- "source": [
- "a = \"Hello Python\"\n",
- "a_1 = a[ : 5] # a_1가 'HELLO'를 가리킴\n",
- "a_2 = a[6 : ] # a_2가 'Python'를 가리킴\n",
- "\n",
- "a = a_2 + \" \" + a_1 # (+)로 둘을 붙임\n",
- "\n",
- "print(a)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "#### *1번 코드 설명*\n",
- "슬라이싱은 객체이름[시작(포함):끝(포함X)]의 구조를 가진다. \n",
- "그래서 Hello을 나타내기 위해 a[ : 5 ] (앞 칸이 비면 맨 앞으로 인식), \n",
- "Python를 나타내기 위해 a[ 6 : ] (뒷 칸이 비면 맨 뒤로 인식)라 한 다음 \n",
- "이 둘을 + 연산자로 붙였다."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### **2번) b=\"Hello Python World\" 문자열을 Slicing과 연결 연산자 (+)를 사용하여 \"World Python Hello\"로 변경하시오.**\n",
- " - [주의] b 변수 자체에 \"World Python Hello\" 문자열이 저장되어야 함 "
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 15,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "World Python Hello\n"
- ]
- }
- ],
- "source": [
- "b = \"Hello Python World\"\n",
- "b_1 = b[ : 5] # b_1가 'HELLO'를 가리킴\n",
- "b_2 = b[6 : 12] # b_2가 'Python'를 가리킴\n",
- "b_3 = b[13 : ] # b_2가 'World'를 가리킴\n",
- "\n",
- "b = b_3 + \" \" + b_2 + \" \" + b_1 # (+)로 셋을 붙임\n",
- "print(b)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "#### *2번 코드 설명*\n",
- "슬라이싱은 객체이름[시작(포함):끝(포함X)]의 구조를 가진다. \n",
- "Hello을 나타내기 위해 b[ : 5 ], Python를 나타내기 위해 b[ 6 : 12 ], \n",
- "World를 나카내기 위해 b[ 13 : ]라 한 다음, 모두 + 연산자로 붙였다."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### **3번) c=\"Hello\"를 \"olleH\"로 변경하시오**\n",
- " - [주의] c 변수 자체에 \"olleH\" 문자열이 저장되어야 함"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 25,
- "metadata": {
- "scrolled": true
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "olleH\n"
- ]
- }
- ],
- "source": [
- "c = \"Hello\"\n",
- "c = c[ : : -1] # 식별자[ : : -1]를 하면 문자열이 뒤집히는 편리한 기능이 있다!\n",
- "\n",
- "print(c)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "#### *3번 코드 설명*\n",
- "슬라이싱은 스텝을 넣는 경우의 형식은 [시작(포함) : 끝(포함X) : 단계(얼마나 넘어갈지)] 인데, [ : : -1]을 할 경우 문자열이 뒤집어지게 된다."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### **4번) s=\"python\"에 대해 다음 문제를 풀어보시오.**\n",
- " - A.s[0], s[0][0], s[0][0][0]은 각각 어떤 값이 나오는지 확인하고 그 이유를 나름대로 설명해 보시오.\n",
- " - B.s[-100], s[100]은 값이 나오는지 에러가 나오는지 확인하고 그 결과에 대한 이유를 나름대로 설명해 보시오.\n",
- " - C.s[-100, 100]은 값이 나오는지 에러가 나오는지 확인하고 그 결과에 대한 이유를 나름대로 설명해 보시오.\n",
- " - D.s[1:-1]의 결과를 확인하고 그 결과에 대한 이유를 정확하게 설명하시오.\n",
- " - E.s[3:-3]의 결과를 확인하고 그 결과에 대한 이유를 정확하게 설명하시오."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 39,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "p\n",
- "p\n",
- "p\n"
- ]
- }
- ],
- "source": [
- "s = \"python\"\n",
- "\n",
- "#A\n",
- "print(s[0])\n",
- "print(s[0][0])\n",
- "print(s[0][0][0])"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "**4-A (이유)**\n",
- "\n",
- " 1차원배열이든 다차원 배열이든 메모리에서 배열의 원소들은 일직선으로 저장된다 \n",
- " (예: [0][0]/[0][1]/[0][2]/[1][0]/[1][1]/[1][2] <- 일직선으로).\n",
- " \n",
- " 그래서 1차원배열이든 2차원배열이든 3차원배열이든 [0][0][0]의 원소는 'python'의 'p'이다."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 42,
- "metadata": {},
- "outputs": [
- {
- "ename": "IndexError",
- "evalue": "string index out of range",
- "output_type": "error",
- "traceback": [
- "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
- "\u001b[1;31mIndexError\u001b[0m Traceback (most recent call last)",
- "\u001b[1;32m<ipython-input-42-6f9b759fea56>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[1;31m#B\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 4\u001b[1;33m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0ms\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m-\u001b[0m\u001b[1;36m100\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 5\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0ms\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m100\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
- "\u001b[1;31mIndexError\u001b[0m: string index out of range"
- ]
- }
- ],
- "source": [
- "s = \"python\"\n",
- "\n",
- "#B\n",
- "print(s[-100])\n",
- "print(s[100])"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "**4-B (이유)**\n",
- "\n",
- " pythom' 문자열의 길이는 6이다. 즉 s[-6]~s[5]까지만 가능하기때문에, 이 범위를 벗어나면 오류가 생긴다."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 51,
- "metadata": {},
- "outputs": [
- {
- "ename": "TypeError",
- "evalue": "string indices must be integers",
- "output_type": "error",
- "traceback": [
- "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
- "\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)",
- "\u001b[1;32m<ipython-input-51-ed12869a3a4e>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[1;31m#C\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 4\u001b[1;33m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0ms\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m-\u001b[0m\u001b[1;36m100\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m100\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
- "\u001b[1;31mTypeError\u001b[0m: string indices must be integers"
- ]
- }
- ],
- "source": [
- "s = \"python\"\n",
- "\n",
- "#C\n",
- "print(s[-100, 100])"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "**4-C (이유)**\n",
- "\n",
- " 인덱스값은 정수만 가능하기 때문에 오류가 나타난다."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 58,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "yp\n"
- ]
- }
- ],
- "source": [
- "s = \"python\"\n",
- "\n",
- "#D\n",
- "print(s[1 : :-1])"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "**4-D (이유)**\n",
- "\n",
- " Slicing의 형식은 [start(included) : stop(excluded) : step] 이다.\n",
- " \n",
- " start는 인덱스값이 1인 'y'이고, step은 -1이므로 시작부분인 'y'를 기준으로 오른쪽이 아닌 왼쪽(마이너스이기 때문에)으로 한 칸씩 존재하는 원소들(이 문제에선 'p'만 해당)을 출력한다."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 52,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "hp\n"
- ]
- }
- ],
- "source": [
- "s = \"python\"\n",
- "\n",
- "#E\n",
- "print(s[3 : :-3])"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "**4-E (이유)**\n",
- "\n",
- " Slicing의 형식은 [start(included) : stop(excluded) : step] 이다.\n",
- " \n",
- " start는 인덱스값이 3인 'h'이고, step은 -3이므로 시작부분인 'h'를 기준으로 오른쪽이 아닌 왼쪽(마이너스이기 때문에)으로 3칸씩 존재하는 원소들(이 문제에선 'p'만 해당)을 출력한다."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### **5번) for문을 활용하여 1부터 100사이의 홀수를 출력하시오.**"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {
- "scrolled": true
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99 "
- ]
- }
- ],
- "source": [
- "for i in range(0, 50, 1) : \n",
- " print(2*i + 1, end = \" \")\n",
- "\n",
- "# (2*i + 1)라는 식으로 홀수를 표현\n",
- "# 홀수를 (2*i + 1)로 표현했기 때문에 범위를 0에서 50까지 했음"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "#### *5번 코드 설명*\n",
- "range는 range( 시작(포함), 끝(포함X), 단계 )형식을 가지고 있다. \n",
- "홀수를 (2 * i + 1)의 형태로 나타내기 때문에 1부터 100사이의 홀수를 \n",
- "보여주기 위해선 range의 범위를 1부터 50까지 지정했다."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### **6번) while문을 활용하여 1부터 100사이의 짝수의 합을 계산하여 출력하시오.**"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "2450\n"
- ]
- }
- ],
- "source": [
- "i = 1\n",
- "sum = 0 # 짝수의 합을 저장할 객체\n",
- "\n",
- "while i < 50 : # 짝수를 2*i로 표현 >> 범위를 1~50으로 지정함\n",
- " sum += 2*i # 2부터 순서대로 짝수를 sum에 누적으로 더함\n",
- " i += 1 # 짝수를 sum에 더한 후 i를 1씩 올려줌\n",
- " \n",
- "print(sum)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "#### *6번 코드 설명*\n",
- "짝수의 합을 저장할 sum을 선언하고 i가 1부터 50이 되기 전까지를 범위로 지정했다. \n",
- "왜냐하면 짝수를 (2 * i)의 형태로 사용할 것이며, 1부터 100사이의 짝수를 더하긴 위해선 \n",
- "2부터 98까지의 짝수를 더해야 한다. 그래서 범위를 1부터 50전까지 지정했다.\n",
- "\n",
- "반복문이 시행될 때마다 sum에 짝수가 더해지고 i가 1씩 증가한다."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### **7번) 사용자로 부터 임의의 정수를 입력받고, 해당 숫자를 역순으로 출력하는 프로그램을 작성하시오.**\n",
- " - [실행 예]\n",
- " 정수를 입력하세요: 3125 \n",
- " 숫자 역순은 5213 입니다."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {
- "scrolled": true
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "정수 입력(두 자릿수부터) : 123\n",
- "\n",
- "입력하신 숫자 역순은 321 입니다\n"
- ]
- }
- ],
- "source": [
- "num = input('정수 입력(두 자릿수부터) : ') # input >> 사용자가 직접 입력\n",
- "\n",
- "num_len = len(num) # 사용자가 입력한 문자열의 길이를 받음\n",
- "index = num_len - 1\n",
- "# 사용자가 입력한 문자열의 마지막 인덱스를 구하기위해 (문자열 길이)-1 을 받음\n",
- "\n",
- "result = \"\" # 역수를 받을 객체 초기화\n",
- "while index >= 0 : # 인덱스가 '0'이 된 후 반복문이 종료됨\n",
- " result += num[index] # result에 누적으로 사용자가 입력한 문자열의 뒤부터 넣는다\n",
- " index -= 1 # 한 차례가 끝나며 인덱스의 값을 1씩 줄임\n",
- " \n",
- "print(\"\\n입력하신 숫자 역순은 \" + result + \" 입니다\")"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "#### *7번 코드 설명*\n",
- "input으로 사용자로 부터 직접 숫자를 받는다. \n",
- "num_len에 len함수를 통해 사용자가 입력한 문자열num의 길이를 구한다. \n",
- "index는 역순으로 출력하기 위해서 num 문자열의 마지막 원소의 인덱스를 넣는다. \n",
- "(index = num_len - 1이라는 수식을 통해 수행한다) \n",
- "\n",
- "result는 역순으로 출력한 문자열을 저장하는 객체로 \"\"로 초기화한다. \n",
- "while을 인덱스가 0이 될 때까지 돌리며, 돌릴 때마다 num의 맨 뒤부터 \n",
- "result에 누적으로 저장하고 index를 1씩 줄인다."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### **8번) 사용자로 부터 정수를 입력받아서 1부터 그 사이에 존재하는 소수 (Prime number)를 출력하는 파이썬 프로그램을 작성하시오.**"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "정수 입력 : 17\n",
- "2 3 5 7 11 13 "
- ]
- }
- ],
- "source": [
- "num = input('정수 입력 : ') # input >> 사용자가 직접 입력\n",
- "num = int(num) #문자열 -> 정수\n",
- "\n",
- "i = 1\n",
- "\n",
- "while i < num : # i가 num보다 같아지면 반복문 종료\n",
- " count = 0 # 소수인지 판단하는 변수 선언\n",
- " j=1\n",
- " while j < i : # 어느 수보다 작은 수들로 나눔\n",
- " if i%j == 0 : count += 1 # 나누어지면 count 1 증가\n",
- " j+=1\n",
- " if count == 1 : print(i, end = \" \")\n",
- " #자기보다 작은 수로 나누어진적이 한번밖에 없다면(==소수) 출력\n",
- " i += 1"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "#### *8번 코드 설명*\n",
- "input으로 사용자에게 직접 입력받고 입력 받은 문자열은 int()을 통해 정수로 변환해준다. \n",
- "변수 i는 1부터 사용자가 지정하는 소수 사이의 수를 나타낸다\n",
- "\n",
- "**(첫번째 while문 안에서 일어나는 일들)** \n",
- "i가 num보다 작을 때만 반복문이 돌아가고, 돌아갈 때마다 소수인지 판단하는 count가 0으로, 변수 i를 나눌 수인 j를 1로 초기화한다.\n",
- "\n",
- "안 쪽 while은 j가 i보다 작으면 돌아가는데, 돌아 갈 때마다 j를 1씩 늘어나며, i%j가 0인지 아닌지 판단한다. \n",
- "만약 i%j가 0이면 j는 i의 인수이므로 count를 ++한다. \n",
- "\n",
- "안 쪽 while에서 나오면 i가 어느 정도의 인수를 가지는지(자기자신 제외)를 알 수 있으므로 어떤 i가 소수인지도 판단할 수 있다(소수의 인수는 1과 자기자신뿐이므로). \n",
- "그래서 count가 1이면 i의 인수가 하나뿐이라는 것이고 즉 소수임을 알 수 있다(j의 범위는 1부터 i-1로 지정했으므로 i가 포함되지 않음). 그러므로 i를 출력하고 i를 1씩 증가시킨다. \n",
- "**(첫번째 while문 안에서 일어나는 일들)**"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### **9번) [ACM-ICPC 문제 2441번] **\n",
- " - 별찍기_4 \n",
- "첫째 줄에는 별 N개, 둘째 줄에는 별 N-1개, ..., N번째 줄에는 별 1개를 찍는 문제 \n",
- "하지만, 오른쪽을 기준으로 정렬한 별 (예제 참고)을 출력하시오."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "from IPython.display import Image\n",
- "Image(filename='phuong huong xac dinh.PNG')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 42,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "정수 입력 : 5\n",
- "*****\n",
- " ****\n",
- " ***\n",
- " **\n",
- " *\n"
- ]
- }
- ],
- "source": [
- "num = int(input('정수 입력 : ')) # input >> 사용자가 직접 입력\n",
- "\n",
- "for i in range(num, 0, -1) :\n",
- " print(' '*(num-i) + '*'*(i)) # (num-i)만큼 공백출력 + (i)만큼 '*' 출력"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "#### *9번 코드 설명*\n",
- "input으로 사용자에게 직접 입력받고 입력 받은 문자열은 int()을 통해 정수로 변환해준다. \n",
- "\n",
- "for문의 범위를 변수 i와 range를 통해 num부터 0 전까지 -1씩 하도록 지정했다. \n",
- "공백의 범위는 각 줄마다 (num - i)칸 씩이고 * 은 i칸 만큼 출력하면 된다. \n",
- "\n",
- "i는 처음에 num으로 초기화 되어있으므로 처음 공백은 num-num이 되므로 0칸이고, \n",
- "별표시는 i가 num이므로 num의 수만큼 출력된다. 반복문을 돌릴 때마다 i는 1씩 줄어드므로 \n",
- "다음 줄에는 공백은 num - (num -1) = 1이 되고 * 는 num -1 칸이 된다."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### **10번) [ACM-ICPC 문제 11721번] **\n",
- " - 열 개씩 끊어 출력하기 \n",
- "알파벳 소문자와 대문자로만 이루어진 길이가 N인 단어가 주어진다. \n",
- "한 줄에 10글자씩 끊어서 출력하는 프로그램을 작성하시오."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 70,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "문장 입력 : qwertyuiopasdfghjklzxcvbnm\n",
- "qwertyuiop\n",
- "asdfghjklz\n",
- "xcvbnm\n"
- ]
- }
- ],
- "source": [
- "line = input(\"문장 입력 : \") # 사용자가 직점 문장 입력\n",
- "line_len = len(line) # 입력 문장 길이 계산\n",
- "\n",
- "if line_len == 0 : print(\"0초과인 문장을 적으시오\")\n",
- "elif line_len > 100 : print(\"100미만인 문장을 적으시오\")\n",
- "else :\n",
- " portion = int(line_len / 10) # 10줄씩 끊어을 경우 몇 줄 나올지 계산\n",
- "\n",
- " i = portion-1 # 몇 번째 줄인지 표시\n",
- " first = 0 # 끊은 문장의 맨 앞 원소 인덱스\n",
- " while i>= 0 :\n",
- " print(line[first:10*(portion - i)]) #끊은 문장의 맨 앞부터 10글자 까지 출력\n",
- " first = 10*(portion - i) # 전 줄의 마지막 다음 원소가 처음이 됨\n",
- " i -= 1 # i를 1씩 감소\n",
- " print(line[first:]) # 마지막으로 남은 문장들 출력"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "#### *10번 코드 설명*\n",
- "input으로 사용자에게 직접 입력받고 그 문장의 길이를 len을 통해 구한다. \n",
- "\n",
- "portion은 사용자가 입력한 문자열의 길이를 10으로 나눈 다음 int로 변환시킨 값을 저장한다. i는 portion-1 한 값을 저장한다. \n",
- "first는 각각 10개씩 끊어 출력할 문장들의 맨 앞을 나타내는 인덱스이고 0으로 초기화 한다. \n",
- "\n",
- "while문은 i가 0까지 될 때까지 돌아간다. \n",
- "문장은 슬렉싱을 이용하여 끊어서 출력한다. 시작부분은 first이고 끝은 10 * (portion - i)이다. 그 다음 first는 10 * (portion - i)이 되고 i를 1씩 줄인다. while문이 끝나면 10글자가 안되는 마지막 문자을 출력한다. \n",
- "\n",
- "예를 들어 문장길이가 33이면 portion은 3이고 i는 2이다. \n",
- "첫 줄은 [ first(=0) : 10 x (portion - i)(= 10 x (3 - 2) ) ] == [0 : 10] 이다. \n",
- "그 다음 first는 10 x (portion - i)즉 10이 되고, i는 1이 된다. \n",
- "다음 줄은 [first(=10) : 10 x (portion - i)(= 10 x (3 - 1) ) ] == [0 : 20] 이다. \n",
- "다다음 줄은 [first(=20) : 10 x (portion - i)(= 10 x (3 - 0) ) ] == [0 : 30] 이다. \n",
- "그러면 i가 -1이 되므로 반복문이 끝나고 나머지 [30 : ]이 출력된다."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### **11번) [ACM-ICPC 문제 2839번] **\n",
- " - 설탕배달 \n",
- " 상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그램 봉지와 5킬로그램 봉지가 있다. \n",
- "상근이는 귀찮기 때문에, 최대한 적은 봉지를 들고 가려고 한다. 예를 들어, 18킬로그램 설탕을 배달해야 할 때, 3킬로그램 봉지 6개를 가져가도 되지만, 5킬로그램 3개와 3킬로그램 1개를 배달하면, 더 적은 개수의 봉지를 배달할 수 있다. \n",
- "상근이가 설탕을 정확하게 N킬로그램 배달해야 할 때, 봉지 몇 개를 가져가면 되는지 그 수를 구하는 프로그램을 작성하시오. "
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 74,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "kg입력: 11\n",
- "3\n"
- ]
- }
- ],
- "source": [
- "kg = int(input(\"kg입력: \")) #사용자가 직접 입력 + 정수로 변환\n",
- "\n",
- "result = 0\n",
- "\n",
- "if kg % 5 == 0 : # 5의 배수인 경우는 5kg만 들고가는 것이 효율적\n",
- " result = int(kg / 5)\n",
- " \n",
- "elif kg % 5 == 1 : # 5로 나누면 나머지가 1인 경우\n",
- " result = int(kg / 5) - 1 # 5로 나눈 값에서 1을 뺌 (계속 보이는 규칙)\n",
- " kg -= 5*result # 그 만큼의 무게를 뺌\n",
- " result += int(kg / 3) # 나머지 무게에서 3으로 나눔\n",
- " \n",
- "elif kg % 5 == 2 : # 5로 나누면 나머지가 2인 경우\n",
- " if kg == 7 : result = -1 # 7은 3kg와 5kg로 나눠들고 갈 수 없음 -> -1\n",
- " else :\n",
- " result = int(kg / 5) - 2 # 5로 나눈 값에서 2을 뺌 (계속 보이는 규칙)\n",
- " kg -= 5*result # 그 만큼의 무게를 뺌\n",
- " result += int(kg / 3) # 나머지 무게에서 3으로 나눔\n",
- " \n",
- "elif kg % 5 == 3 : # 5로 나누면 나머지가 3인 경우\n",
- " result = int(kg / 5) # 5로 나눈 값을 구함 (계속 보이는 규칙)\n",
- " kg -= 5*result # 그 만큼의 무게를 뺌\n",
- " result += int(kg / 3) # 나머지 무게에서 3으로 나눔\n",
- " \n",
- "elif kg % 5 == 4 : # 5로 나누면 나머지가 4인 경우\n",
- " if kg == 4 : result = - 1 # 4은 3kg와 5kg로 나눠들고 갈 수 없음 -> -1\n",
- " else :\n",
- " result = int(kg / 5) - 1 # 5로 나눈 값에서 1을 뺌 (계속 보이는 규칙)\n",
- " kg -= 5*result # 그 만큼의 무게를 뺌\n",
- " result += int(kg / 3) # 나머지 무게에서 3으로 나눔\n",
- " \n",
- "print(result)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "#### *11번 코드 설명*\n",
- "input으로 사용자에게 직접 입력받고 정수로 변환시켜준다. \n",
- "최저 봉투수를 저장한 result를 0으로 초기화시켜준다. \n",
- "\n",
- "경우의 수를 총 5개, 사용자가 입력한 무게에서 5를 나눴을 때 나머지가 총 5개 나옴을 이용했다. \n",
- "\n",
- "**(이제부터 적을 규칙들은 직접 3부터 23까지 효율적인 3kg와 5kg의 봉투 수를 계산하면서 나온 규칙들이라 자세히 설명못하므로 양해 부탁드립니다)** \n",
- "\n",
- "**(1)** 먼저 나머지가 0일 경우 5의 배수라는 의미이기 때문에 그 무게에서 5를 나눈 몫의 값만큼만 들고 가는 것이 효율적이다. \n",
- "**(2)** 7은 3kg과 5kg론 가져갈 수 없으므로 -1을 출력하도록 예외처리를 한다. \n",
- "나머지가 1인 경우 나머지가 0이 경우 나오는 5kg 봉투 수보다 1작다. 그래서 result = int(kg / 5) - 1 함으로써 5kg 봉투수를 저장한 다음에 사용자가 지정한 무게에서 5kg봉투 수 만큼 무게를 빼준다(kg -= 5xresult). 그 나머지 무게를 3으로 나눈 몫을 result에 누적으로 더해준다. \n",
- "**(3)** 나머지가 2인 경우는 나머지가 0이 경우 나오는 5kg 봉투 수보다 2작다. 그러므로 result = int(kg / 5) - 2 한 다음 사용자가 지정한 무게에서 5kg봉투 수 만큼 무게를 빼준다(kg -= 5xresult). 그 나머지 무게를 3으로 나눈 몫을 result에 누적으로 더해준다. \n",
- "**(4)** 나머지가 3인 경우는 나머지가 0인 경우에 나오는 5kg 봉투수와 같다. 그 다음 앞과 똑같이 그만큼의 무게를 빼준다음 3kg 봉투수를 구한 다음 result에 누적으로 더한다. \n",
- "**(5)** 4은 3kg과 5kg론 가져갈 수 없으므로 -1을 출력하도록 예외처리를 한다. \n",
- "마지막으로 나머지가 4인 경우는 나머지가 0이 경우 나오는 5kg 봉투 수보다 1작다. 앞과 같이 그만큼의 무게를 뺀 다음 3kg봉투 수를 구한 다음 result에 누적으로 더한다. "
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### 소감)\n",
- "처음에 강의만 잘 들었다면 별 탈없이 손 쉽게 넘어갈 수 있는 문제들이어서 가벼운 마응으로 시작했지만, 점점 C++문법과 파이썬 문법이 헷갈리게 되면서 구글에 파이썬 문법과 함께 여러 정보들음 검색해보았고 그 덕분에 좀더 폭 넓게 코딩을 할 수 있었다."
- ]
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.6.5"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
- }
Add Comment
Please, Sign In to add comment