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
1 2 3 4 5 6 7 8 9 10 | 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
1 2 3 4 5 6 7 8 9 | 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<t;i++{ fmt.scanf( "%d=" " %d=" " %d" ,= "" &a,= "" &b,= "" &n)= "" for = "" j= "0;j<N;j++{" total= "" := "a" += "" b*( 2 <<uint(j)- 1 )= "" fmt.printf( "%d=" " " ,= "" total)= "" }= "" fmt.println()= "" <= "" pre= "" > </t;i++{> |
Day 6. Let's Review!
동영상에서는 앞에서 배운 것들을 복습하는 시간이지만, 동영상에 관심이 없는 저는 그냥 문제만 풀겠습니다.
이번 문제는 반복문을 활용해 #(해쉬태그)로 이루어진 계단을 만드는 것입니다.
예제를 한 번 살펴보겠습니다.
00000#
0000##
000###
00####
0#####
######
구분이 쉽도록 하기 위해 공백을 0으로 채웠습니다.
입력받은 숫자 6으로 실제로는 정방형에 가까운 2차원 배열을 생성하는 것입니다.
근데 이걸 출력하기 위해 2차원 배열을 만들어서 반복문 돌려서 공백이랑 해쉬태그를 밀어넣고
그 배열을 출력하는 건 매우 비효율적인 일입니다.
반복문 한개와 간단한 연산을 활용해 이 문제를 풀면 됩니다.
Python 3
1 2 3 4 5 6 7 8 9 | #!/bin/python3 import sys n = int ( input ().strip()) s = '#' for i in range ( 1 , n + 1 ): print ( " " * (n - i) + s * i) |
Go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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
1 2 3 4 5 6 7 8 9 | #!/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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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<n;i++{ fmt.scanf( "%d" ,&ai[i])= "" }= "" for = "" j:= "len(Ai)-1;j" >= 0 ;j--{ fmt.Print(Ai[j], " " ) } } </n;i++{> |
Day 8. Dictionaries and Maps!
딕셔너리와 해쉬맵에 대해 알아봅니다. 딕셔너리는 Key와 Value를 한 쌍으로 가지는 자료형입니다. 배열이나 튜플처럼 순차적으로 값을 구하는 것이 아니라 Key를 통해 Value를 가져올 수 있습니다. 파이썬은 딕셔너리를, Go는 맵을 지원합니다.
이 문제는 이름과 전화번호를 한 쌍으로 가지는 딕셔너리를 생성하고 해당 키(이름)을 가지는 전화번호를 출력하는 프로그램입니다. Python 은 잘 되는데 Go가 여기서 또 말썽입니다.
Go의 코드에서 이름을 개행이 들어올 때까지 입력받습니다. 따라서 해당 이름이 홍 이던지 길동이던지 홍 길동 이던지 상관없이 하나의 문자열로 입력받을 수 있습니다. 하지만 어찌된 일인지 프로그램이 작동하지 않습니다...
Python 3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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 케이스는 안된다는...)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | 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이 아닙니다. ! <- 이거요!!)입니다.
파이썬으로 이를 표현하자면,
1 2 3 4 | 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
1 2 3 4 5 6 7 8 9 10 11 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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 |