오늘은 go programming 연습삼아
아래의 예제 코드를 만들어 보았습니다.
string 이 아닌 byte array 에 숫자를 할당해 두고
1,000 단위로 콤마를 붙여주는 코드입니다.
package main
import "fmt"
func comma(s []byte) []byte {
rByteArray := make([]byte, len(s)+len(s)/3)
j := 0
for i := 0; i < len(s); i++ {
if i != 0 && i%3 == 0 {
rByteArray[j] = ','
j = j + 1
rByteArray[j] = s[i]
j = j + 1
continue
}
rByteArray[j] = s[i]
j = j + 1
}
return rByteArray
}
func main() {
bArray := []byte{'1', '2', '3', '0', '0', '0'}
fmt.Println(string(comma(bArray)))
}
첫번 째 위치인 index 0 에서는 콤마를 생략하고
그 다음부터 3으로 나눠지는 위치마다 콤마를 붙여 rByteArray 에 할당하였습니다.
rByteArray 사이즈의 경우, 원래 byte array 에 콤마를 붙여줘야 하기 때문에
예상되는 콤마 갯수( s의 길이에서 3을 나눈 수 )만큼 사이즈를 할당하여 새로운 byte array를 구성하였습니다.
이렇게 사이즈를 키워서 array를 만들지 않으면
중간에 끊기게 될 것입니다.
문제점
위에처럼 코드를 작성하면 문제가 있습니다.
바로 콤마가 왼쪽부터 붙는다는 것인데요.
아래 처럼 테스트를 해 보면 문제를 발견할 수 있습니다.
package main
import "fmt"
func comma(s []byte) []byte {
rByteArray := make([]byte, len(s)+len(s)/3)
j := 0
for i := 0; i < len(s); i++ {
if i != 0 && i%3 == 0 {
rByteArray[j] = ','
j = j + 1
rByteArray[j] = s[i]
j = j + 1
continue
}
rByteArray[j] = s[i]
j = j + 1
}
return rByteArray
}
func main() {
bArray := []byte("12345671123123123")
fmt.Println(string(comma(bArray)))
}
조금 더 긴 byte array 로 테스트를 해보면 다음과 같이 결과가 나옵니다.
./comma_nonrecur
123,456,711,231,231,23
1000 단위로 콤마를 찍고싶었는데
왼쪽부터 찍다보니 결과가 기대하는 것과 다소 다릅니다.
아래처럼 for loop를 byte array 끝에서부터 시작할 수 있도록 바꾸면
기대하는 결과를 얻을 수 있습니다.
package main
import "fmt"
func comma(s []byte) []byte {
rByteArray := make([]byte, len(s)+len(s)/3)
j := len(s) + len(s)/3 - 1
move := 0
for i := len(s) - 1; i >= 0; i-- {
if move != 0 && move%3 == 0 {
rByteArray[j] = ','
j = j - 1
rByteArray[j] = s[i]
j = j - 1
move = move + 1
continue
}
rByteArray[j] = s[i]
j = j - 1
move = move + 1
}
return rByteArray
}
func main() {
bArray := []byte("12345671123123123")
fmt.Println(string(comma(bArray)))
}
우측부터 이동하도록 for loop를 변경하였고
콤마를 붙이는 위치를 지정하기 위해 move 라는 integer 변수를 이용해서
원본 데이터 bArray 의 우측 끝부터 얼만큼 이동하였는지를 확인합니다.
wh.
'CS > Go' 카테고리의 다른 글
Go programming 복합 타입 - 슬라이스 에 대하여 (0) | 2023.07.29 |
---|---|
Go programming 복합 타입 - 배열 에 대하여 (0) | 2023.07.29 |
[Go programming] Requesting http get method to an url from an argument (0) | 2023.06.24 |
[Go언어연습] 중복 된 내용이 있는 파일명 리스트를 출력하는 프로그램 (0) | 2023.06.06 |
[Go언어] 중복 줄 찾기 프로그램, 입/출력에 활용하는 bufio 패키지 (0) | 2023.05.18 |