코드 컨테스트 전문 페이지인 Hackerrank에서 30 days of code라는 행사를 개최하고 있습니다.
C, C++, Java와 같은 잘 알려진 언어들 부터 COBOL과 Fortran, Pascal 까지 다양한 언어로 이 페이지의 문제를 풀고 제출할 수 있습니다.
프로그래밍을 처음 접하는 분들을 위해 비디오 튜토리얼을 제공해 튜토리얼을 따라하면 충분히 문제를 풀 수 있도록 유도하고 있습니다. 물론 Java로 하고 있어 언어의 선택권이 제한됩니다.
문제가 어렵지 않다는 점에서 속도가 중요한 만큼 Python3 로 답안 제출을 한 뒤, 다른 언어로 다시 푸는 연습을 하고 있습니다.
답안을 모두 올리는 것은 치팅의 소지가 발생할 수 있으므로 지양하도록 하고 Go 언어와 이 문제들을 연계해 정리해볼까 합니다.
Day 8 의 딕셔너리와 맵 문제의 경우 Java가 아닌 다른 언어로 했을 경우 문제가 요구하는 모든 조건을 만족시켰음에도 제대로 채점되지 않는 문제가 있습니다.
이것은 이 컨테스트의 기반이 Java인지라 다른 언어로도 구현 가능한 것들이 답안을 체크하는 과정에서 문제가 생기는 것으로 보입니다. 혹시 다른 언어로 하다가 막힌다면 튜토리얼 따라 Java로 작성하셔서 넘어가시면 됩니다.
이번시간은 Day 1 부터 Day 5 까지 나온 문제들을 정리해드리겠습니다. 다시 한 번 말씀드리지만, 이것은 답안을 정리하는 것이 아닌 Go 언어로 재해석하는 것임을 밝힙니다. 답 빨리 안올라온다고 찡찡대시면 안되요~
Day 0. Print Hello World!
역시 프로그래밍을 시작하는데에는 뭐니뭐니해도 Hello World 겠죠.
프로그래밍을 처음 하시는 분들도 Hello World를 출력하게 된다면 절반은 달성한 것이라고 말씀드릴 수 있습니다.
"Hello World." 와 "Welcome to 30 Days of Code."를 출력하면 간단히 넘어갈 수 있습니다.
go 언어는 fmt 패키지에서 입력과 출력함수를 불러오는데 앞에 패키지 명을 명시해주셔야 합니다.
출력함수에는 fmt.Print(출력 후 새 줄로 넘어가지 않음) fmt.Println(값을 출력 후 새줄로 넘어감) fmt.Printf(형식을 지정하여 값을 출력)이 있으니, 상황에 맞는 함수를 선택하시면 됩니다.
그에 반해 Python은 간단하죠? print()로 출력하시면 됩니다.
Python 3
print("Hello World.") print("Welcome to 30 Days of Code.")
Go
package main import "fmt" func main() { //Enter your code here. Read input from STDIN. Print output to STDOUT fmt.Println("Hello World.") fmt.Println("Welcome to 30 Days of Code.") }
Day 1. Data Types!
자료형에 관해 알아볼 수 있는 문제입니다.
이번 문제에는 (5.35, 'a', false, 100, "I am a code monkey", true, 17.3, 'c', "derp")가 각각 어떤 자료형을 가지고 있는지를 출력하시면 됩니다.
primitive type(기본형)은 일반적인 자료형을 말합니다. byte, short, int, long, float, double, boolean, char 가 여기에 해당합니다. 이 타입은 그 실제 값을 기억합니다.
reference type(참조형)은 배열처럼 인스턴스 가능한 타입을 말합니다. String, Scanner, Random, Die, int[], String[] 등이 여기에 해당합니다. 이 타입은 주소값을 기억합니다.
해당 언어에서 위의 괄호안의 값이 각각 어떤 자료형을 가지고 어떤 타입인지를 출력하면 되는 간단한 문제입니다.
Python 3
print("Primitive : Double") print("Primitive : Character") print("Primitive : Boolean") print("Primitive : Integer") print("Referenced : String") print("Primitive : Boolean") print("Primitive : Double") print("Primitive : Character") print("Referenced : String")
Go
package main import "fmt" func main() { //Enter your code here. Read input from STDIN. Print output to STDOUT fmt.Println("Primitive : double") fmt.Println("Primitive : char") fmt.Println("Primitive : boolean") fmt.Println("Primitive : int") fmt.Println("Referenced : String") fmt.Println("Primitive : boolean") fmt.Println("Primitive : double") fmt.Println("Primitive : char") fmt.Println("Referenced : String") }
Day 2. Arithmetic!
이제 본격적으로 연산을 하게 되는군요.
이 문제에서 m,t,x 세가지의 값이 있습니다. m은 double type의 원래 가격을 뜻합니다. t는 원래가격에서 팁의 비율을 뜻합니다. x는 가격에 세금의 비율을 뜻합니다.
즉, 팁은 m*t/100이, 세금은 m*x/100이라는 값을 가지게 되며, 최종가격은 m과 tip, tax의 합을 뜻합니다.
최종가격을 출력할 때에는 int 값을 가져야 한다고 하네요.
python은 별 문제없이 넘어가지만 go에서 갑자기 한번 막히셨을지도 모르겠습니다.
golang은 round 함수가 존재하지 않습니다. 하지만 float64의 출력과정에서 %.0f 로 출력하시면 자동으로 반올림을 실시합니다.
Python 3
m = float(input()) t = float(input()) x = float(input()) tip = (m * t) / 100 tax = (x * m) / 100 FinalPrice = round(m + tip + tax) print("The final price of the meal is $%d." % FinalPrice)
Go
package main import "fmt" func main() { //Enter your code here. Read input from STDIN. Print output to STDOUT var m,t,x float64 fmt.Scan(&m) fmt.Scan(&t) fmt.Scan(&x) tip := (m * t) / 100 tax := (x * m) / 100 FinalPrice := m + tip + tax fmt.Printf("The final price of the meal is $%.0f.", FinalPrice) }
Day 3. If-Else Statements!
조건문 중 가장 유명한 if 문을 사용해 보는 챕터입니다.
이 문제는 if 문을 사용해 조건에 맞으면 지정값을, 아니면 다른 값을 출력하도록 하는 간단한 문제입니다. 다만 if문을 여러번 쓰기 때문에 중괄호와 조건 별 우선순위를 선정할 때 주의하셔야 합니다.
실제로 프로그래밍 하실 때에는 먼저 걸러야 하는 조건이 1순위, 가장 많이 등장하는 조건이 2순위 순으로 중요도와 빈도로 조건문을 작성하셔야 효율적이고 정확한 프로그래밍이 가능해집니다.
이 문제의 조건은 순서대로 따라가면 되는 구조이므로 그대로 하시면 됩니다.
조건 1. 홀수일 때 "Weird"
조건 2. 짝수이면서 2 ~ 5일 때 "Not Weird"
조건 3. 짝수이면서 6 ~ 20일 때 "Weird"
조건 4. 짝수이면서 20 이상일 때 " Not Weird"
조건 2,3,4는 짝수라는 공통조건이 있으므로 조건 1을 먼저 수행해야 합니다. 조건 1의 조건문을 통과했다는 것은 짝수라는 것을 의미하니까요. 2 ,3,4의 조건은 자연수의 순서대로 이므로 부등호의 효율적인 사용을 위해 작은 것부터 해나가시면 됩니다.
Python 3
#!/bin/python3 import sys N = int(input().strip()) if (N%2 == 1): print("Weird") elif (N <= 5): print("Not Weird") elif (N <= 20): print("Weird") else: print("Not Weird")
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) if N%2 == 1{ fmt.Println("Weird") }else if N <= 5{ fmt.Println("Not Weird") }else if N <= 20{ fmt.Println("Weird") }else{ fmt.Println("Not Weird") } }
Day 4. Logical Operators + Class vs. Instance!
논리연산자와 클래스를 활용하는 시간입니다.
논리연산자는 연산 결과 참과 거짓을 반환하는 연산자입니다. AND OR NOT 등이 있습니다.
클래스는 객체지향 프로그래밍의 핵심 컨텐츠로 객체내에 있는 변수와 메쏘드를 정의하는 템플릿을 말합니다. 객체는 클래스로 규정된 인스턴스로 변수 대신 실제값을 가집니다.
python은 클래스를 가지고 있는 인터프리터 언어지만, go는 그렇지 않습니다. go는 클래스와 객체가 없으며, 가상함수를 상속하며, interface를 제공합니다.
함수기능을 활용해 클래스를 만들 때 C,C++과는 달리 메인함수의 뒤에 있어도 컴파일 에러가 발생하지 않습니다. 함수정의가 맨위에 있어도, 맨 아래에 있어도 함수 호출이 가능합니다. 클래스와 클래스 상속이 없지만 함수와 가상함수 상속을 통해 클래스를 제공하는 셈입니다.
최근 만들어진 언어 답게 여러개의 값을 한번에 리턴할 수 있어 코드를 더 간결하게 작성할 수 있습니다.
이렇게 반환한 값들 중 특정 값을 무시하고 싶다면 그 자리에 _ 를 넣어주시면 그 값을 무시할 수 있습니다.
변수를 선언하면서 함수를 바로 대입하고 싶다면 :=를 사용하시면 됩니다. go는 변수를 선언하고 대입할 때 자료형을 알아서 지정하기 때문에 변수를 선언하고 값을 계산한 뒤 그 값을 변수에 저장하는 긴 과정을 한 문장으로 끝낼 수 있습니다.
Python 3
class Person: def __init__(self,initial_Age): # Add some more code to run some checks on initial_Age if(initial_Age<0): print("This person is not valid, setting age to 0.") initial_Age = 0 def amIOld(self): # Do some computations in here and print out the correct statement to the console if(age<13): print("You are young.") elif(age<18): print("You are a teenager.") else: print("You are old.") return age def yearPasses(self): # Increment the age of the person in here global age age += 1 //입력할 부분 끝 T=int(input()) for i in range (0,T): age=int(input()) p=Person(age) p.amIOld() for j in range(0,3): p.yearPasses(); p.amIOld(); print("")
Go
package main import "fmt" type person struct { age int } //입력할 부분 시작 func (p person) NewPerson(initial_Age int) person { //Add some more code to run some checks on initialAge if initial_Age < 0{ fmt.Println("This person is not valid, setting age to 0.") initial_Age = 0 } return p } func (p person) amIOld() { //Do some computation in here and print out the correct statement to the console if p.age < 13{ fmt.Println("You are young.") }else if p.age < 18{ fmt.Println("You are a teenager.") }else { fmt.Println("You are old.") } } func (p person) yearPasses() person { //Increment the age of the person in here p.age += 1 return p } //입력할 부분 끝 func main(){ var T,age int fmt.Scan(&T) for i:=0;i<T; i++{ fmt.Scan(&age) p:=person{age: age} p=p.NewPerson(age) p.amIOld() for j:=0;j<3;j++{ p=p.yearPasses() } p.amIOld() fmt.Println() } }
'Tech' 카테고리의 다른 글
아이폰7과 갤럭시s7, LG G5의 변화 (0) | 2016.01.13 |
---|---|
Hackerrank의 한달간의 코드(30 Days of Code) (2) Day 5~Day 9 (0) | 2016.01.12 |
윤서체 소송건으로 보는 폰트 저작권에 관하여 (0) | 2015.12.29 |
Fizz Buzz (2) Go, Java, Python, Ruby (0) | 2015.12.02 |
Fizz Buzz (1) C, C++, C# (0) | 2015.12.02 |