알고리즘 문제는 배열과 전역변수를 많이 사용해서 고언어가 괜찮을 거 같아서 시도함

코드포스로 공부 중임


buffered IO 를 기본으로 사용해야해서 이것만 FastIO struct 랑 관련 메서드 미리 템플릿으로 만들어서 사용하고

데이터 입력받아 전역변수에 저장하거나 슬라이스 할당하는 configure 함수랑

문제푸는 solve 함수만 짜면 되도록 코드구성함


<오늘 풀면서 느낀 좋은 점>

1. Sprintf, Scanf 같은 포맷팅 입출력이 편함(C++의 cin은 편하지만 cout은 끔찍)

2. 이분탐색도 C++ lower_bound가 구현된 sort.SearchInts([]int, int) 가 있어서 upper_bound 필요할 땐 두번째 인자에 +1한 값 주면 됨

3. C++처럼 map[K]int 일 때 디폴트로 0들어감 그래서 빈도수 셀 때 cntMap[K]++ 가 됨(자바나 파이썬은 getOrDefault로 값 구하고 upt해야함)
4. 자바보다 2~3배는 빠르고 메모리도 적게 듬 (아직 dfs나 재귀 깊은건 안해봤지만 잘 될거라 믿음. 코틀린이나 파이썬은 재귀함수 성능이슈가 있음)

5. int가 8byte라서(요즘은 32bit 채점서버 쓰는 곳 없는 듯) long 써야하는데 int써서 틀리는 경우가 없음

자바나 코틀린의 경우 long타입은 배열 인덱스로 못써서 무조건 long만 쓰면 안되고 인덱스에는 무조건 int로 변환해서 써야함

6. 세그먼트 트리 구현시 함수 인자로 upt(a,b, k,l,r int) 와 같이 다량의 int를 쓰는데 이 때 타입을 한번만 적어도 되서 너무 편함

원래 이거 귀찮아서 세그보다 펜윅트리 좋아했는데 go언어에선 세그도 편함

7. 작은 container 타입 만들기가 쉬움. type Item struct { a,b,c,d int } 로 간단히 선언만하고 생성자 만들 필요없음

자바의 경우 다익스트라나 BFS에 쓸 C++의 tuple 같은 느낌의 클래스 쓰려고 생성자 만들고 귀찮았음


<불편한 점>

1. 숫자 %d로 입력받을 때 "%d\n" 처럼 받아야함 \n생략하면 나중에 %d가 0으로 \n를 소모함;; 이건 C랑 달라서 좀 예상 밖이었음

그래서 readInt() 같은 헬퍼함수 못만들고 그냥 io.scan("%d\n", &n) 으로 씀

2. 문자열 입력받고 문자 순회할 때 숫자로 바로 못씀 (s[i] - 'a') 로 못쓰고 유니코드인 rune이기 때문에 int(s[i]) -'a' 와 같은 식으로 씀

3. sort.Slice 등 함수를 인자로 받는 함수를 호출할 때 (즉, 익명함수를 사용할 때) func(인자 타입) 리턴타입 {본문} 다 쓰는게 귀찮 + 가독성 떨어짐

자바나 코틀린의 경우 (a,b) -> {}

4. min,max,abs 등을 만들어써야함. 오버로딩을 지원하지 않기 때문에 math.min 등은 전부 float64를 인자로 받음

템플릿으로 만들어두면 상관없긴 함.

5. 빈도수 셀 때 처음 나오는 경우에만 또 세야하는 경우가 있음. 이 때 if cntMap[x]++ == 1 {} 이 안댐 ++구문은 표현식이 아니여서

cntMap[x]++; if cntMap[x]==1 {} 와 같이 분할해서 써야함 (복잡한 표현식 내부에 ++들어가 있는 빡치는 코드를 방지하는 의도라 이게 맞긴 함)


<불편할 것으로 예상되는 것>

1. PriorityQueue, Deque, LinkedList 자료구조를 써야할 때 표준라이브러리가 많은 자료구조를 지원하지 않아서 불편할 것 같음(아직 안해봄)

2. 배열 초기화를 일일이 해야함 다차원 배열의 초기화가 필요한 경우 좀 짜증날 듯 C++의 vector 생성자의 초기값 부러울 듯


<코드예제>

https://codeforces.com/contest/1791/problem/F

Problem - F - CodeforcesProblem - F - Codeforcescodeforces.com

위 문제 풀이

템플릿엔 configure랑 solve랑 붙어있는데 solve 짜다보니 중간에 세그먼트 트리 코드가 들어감