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)) }
'Tech' 카테고리의 다른 글
Hackerrank의 한달간의 코드(30 Days of Code) (3) Day 10~Day 14 (0) | 2016.01.19 |
---|---|
아이폰7과 갤럭시s7, LG G5의 변화 (0) | 2016.01.13 |
Hackerrank의 한달간의 코드(30 Days of Code) (1) Day 0~Day 4 (0) | 2016.01.10 |
윤서체 소송건으로 보는 폰트 저작권에 관하여 (0) | 2015.12.29 |
Fizz Buzz (2) Go, Java, Python, Ruby (0) | 2015.12.02 |