Day 5. Loops!


  조건문과 함께 중요한 반복문을 코딩해 볼 수 있는 문제입니다. 

  반복문을 설계할 때에는 반복수행할 알고리즘의 최적화와 출력단의 조정이 필요합니다.

  이 문제에서 변수는 반복수행할 케이스의 수:T, a,b와 N이 있습니다.

  이 중 a, b, N에 대해 식으로 정리하자면,

   Nth Term = a + (2^0 * b) + (2^1 * b) + (2^2 * b) + ... + (2^n-1 * b)


  문제를 풀기 전 이 식을 정리해보겠습니다.

   Nth Term = a + b * (2^0 + 2^1 + 2^2 + ... + 2^n-1)

   Nth Term = a + b * (1*(2^n-1)/(2-1))

   Nth Term = a + b * (2^n-1)

  중학교 때? 배운 등비수열의 합을 이용하면 식을 더욱 간단하게 구현할 수 있습니다.

  어떤 문제를 풀 때 그 문제를 그대로 풀기보다는 연산자를 줄이고 식을 간소화해 읽기도 쉽고 효율적인 코딩을 하도록 노력해야 합니다.


이 식을 염두에 두시고, 반복문에 포함할 변수들을 정리하여 작성하시면 쉽게 풀 수 있습니다.

숫자를 입력받을 때 엔터키를 받기 전까지 연속으로 a,b,N을 입력받고, 한 케이스를 한 문장에 출력합니다.

이걸 어떻게 구현할지도 고민해보셔야 할 포인트입니다.

Python

  a,b,N = int(input().split(" "))  ->한번에 받은 입력을 스페이스로 나눠 각각 저장합니다.

  print("~~~", end="")          ->\n이 들어올 때 까지 한 줄에 출력합니다.


Go : Go언어는 기본적으로 C와 비슷한 구석이 많아 따로 설명드리지 않겠습니다.

  fmt.Scanf("%d %d %d", &a, &b, &N)

  fmt.Print("~~")


Python 3


T = int(input())
total = 0

for i in range(0,T):
    a,b,N = [int(x) for x in input().split(' ')]
    total = 0
    for j in range(0,N):
        total = a + b*(pow(2,j+1)-1)
        print("%d " % total, end="")
    print("\n", end="")


Go


package main
import "fmt"

func main() {
 //Enter your code here. Read input from STDIN. Print output to STDOUT
    var T, a, b, i,j, N uint
    fmt.Scan(&T)
    for i=0;i





Day 6. Let's Review!


  동영상에서는 앞에서 배운 것들을 복습하는 시간이지만, 동영상에 관심이 없는 저는 그냥 문제만 풀겠습니다.

  이번 문제는 반복문을 활용해 #(해쉬태그)로 이루어진 계단을 만드는 것입니다.

예제를 한 번 살펴보겠습니다.


00000#
0000##
000###
00####
0#####
######

  구분이 쉽도록 하기 위해 공백을 0으로 채웠습니다.

입력받은 숫자 6으로 실제로는 정방형에 가까운 2차원 배열을 생성하는 것입니다.

근데 이걸 출력하기 위해 2차원 배열을 만들어서 반복문 돌려서 공백이랑 해쉬태그를 밀어넣고

그 배열을 출력하는 건 매우 비효율적인 일입니다.

반복문 한개와 간단한 연산을 활용해 이 문제를 풀면 됩니다.



Python 3


#!/bin/python3

import sys

n = int(input().strip())
s = '#'

for i in range( 1 , n+1):
    print (" "*(n-i) + s*i)


Go


package main
import (
    "fmt"
    "strings"
)

func main() {
 //Enter your code here. Read input from STDIN. Print output to STDOUT
    var n int
    fmt.Scan(&n)
    for i:=1;i<n+1;i++{
        fmt.Printf("%s%s\n",strings.Repeat(" ", n-i),strings.Repeat("#",i))
    }
    
}



Day 7. Arrays!


  배열에 대해 알아보는 시간입니다. N개의 입력을 받아 배열을 생성한 뒤 배열의 마지막 부터 처음까지 반대로 출력하는 문제입니다.

  python은 별다른 문제없이 문제를 풀 수 있었지만, Go는 아직 한 줄의 입력을 여러개의 엘레먼트로 쪼갠 뒤, 배열에 집어 넣을 방법을 찾지 못했습니다. 문제가 해결되는대로 업로드하겠습니다.


Python 3


#!/bin/python3

import sys

n = int(input().strip())
arr = [int(arr_temp) for arr_temp in input().strip().split(' ')]
rra = arr[::-1]
for i in range(0, len(arr)):
    print(rra[i], end=" ")


Go


package main
import "fmt"

func main() {
 //Enter your code here. Read input from STDIN. Print output to STDOUT
    var n int
    
    fmt.Scanln(&n)
    Ai := make([]int, n)   
    for i:=0;i=0;j--{
        fmt.Print(Ai[j]," ")
    }
    
}



Day 8. Dictionaries and Maps!


  딕셔너리와 해쉬맵에 대해 알아봅니다. 딕셔너리는 Key와 Value를 한 쌍으로 가지는 자료형입니다. 배열이나 튜플처럼 순차적으로 값을 구하는 것이 아니라 Key를 통해 Value를 가져올 수 있습니다. 파이썬은 딕셔너리를, Go는 맵을 지원합니다.


  이 문제는 이름과 전화번호를 한 쌍으로 가지는 딕셔너리를 생성하고 해당 키(이름)을 가지는 전화번호를 출력하는 프로그램입니다. Python 은 잘 되는데 Go가 여기서 또 말썽입니다.

Go의 코드에서 이름을 개행이 들어올 때까지 입력받습니다. 따라서 해당 이름이 홍 이던지 길동이던지 홍 길동 이던지 상관없이 하나의 문자열로 입력받을 수 있습니다. 하지만 어찌된 일인지 프로그램이 작동하지 않습니다...


Python 3


import sys

N = int(input().strip()) 
dict = {} 
for x in range(0, N):
    Name = input().strip() 
    Number = input().strip() 
    dict[Name] = Number
    
for FindName in sys.stdin:
    FindName = FindName.strip() 
    if FindName in dict: 
        print(FindName+"="+dict[FindName]) 
    else:
        print("Not found")


Go(2,3,4,5 케이스는 안된다는...)


package main

import "fmt"
import "io"
import "bufio"

func main() {
 //Enter your code here. Read input from STDIN. Print output to STDOUT
    n:=0
    fmt.Scanln(&n)
    m:=make(map[string]int)
    
    for i:=0;i<n;i++{
        var name string
        var phone int
        fmt.Scanln(&name)
        fmt.Scanln(&phone)
        m[name] = phone
    }
    for {
        var name string
        _, err := fmt.Scanln(&name)
        if err == io.EOF{
            break
        } else if value,ok := m[name]; ok {
            fmt.Printf("%s=%d\n", name, value)
        } else {
            fmt.Println("Not found")
        }
    }
}



Day 9. Recursion!


  리커전(재귀호출)을 배우는 시간입니다. 재귀호출이란 분할정복(Divide and Conquer)의 원리로 문제를 해결하는 방법입니다. 주어진 문제를 쪼개고 쪼개고 쪼개 해결하는 방법입니다.

  이 예제를 가장 잘 나타내는 것은 점화식(ignition이 아닙니다. ! <- 이거요!!)입니다.

파이썬으로 이를 표현하자면,


def factorial(n):
    return 1 if (n<1) else n * factorial(n-1)
print factorial(5)
->120

가 됩니다. 

이를 순서대로 보면

5 --> (5<1)>>5*factorial(5-1) --> (4<1)>>5*4*factorial(4-1) --> (3<1)>>5*4*3*factorial(3-1) --> (2<1)>>5*4*3*2*factorial(2-1) --> (1<1)>>5*4*3*2*1*factorial(1-1) --> (0<1)>>5*4*3*2*1

이니까 120을 호출하게 됩니다.



Python 3


def find_gcd(a,b):
   #Write base condition
    if (0 == a % b):
        return b
    return find_gcd(b,a%b)
#Take input
a,b = input().split()
a = int(a)
b = int(b)
gcd=find_gcd(a,b)
print (gcd)


Go


package main
import "fmt"

func find_gcd(x,y int) int {
    if x%y == 0{
        return y
    } else {
        return find_gcd(y,x%y)
    }
}

func main() {
 //Enter your code here. Read input from STDIN. Print output to STDOUT
    var x,y int
    fmt.Scanf("%d %d", &x, &y)
    fmt.Println(find_gcd(x,y))
}


+ Recent posts