[Go] 백준 2089: -2진수

엄기훈·2022년 6월 6일
0

알고리즘 풀이

목록 보기
7/9

❓ 문제

2089번: -2진수

그냥 문제를 위해 만든 진수법이라고 생각했는데, 검색해보니 실제로 있는 이론이라서 놀랐다.

정답률이 30% 언저리라서 많이 어려운 건가 싶었는데, 관련 이론을 알면 굉장히 쉽게 풀 수 있는 문제이다.

⌨️ 전체 코드

package main

import (
	"fmt"
	"strconv"
)

func main() {
	dec := 0
	fmt.Scan(&dec)

	quotient := dec
	remain := 0
	negaBinary := ""
	if dec == 0 {
		negaBinary = "0"
	}
	for quotient != 0 {
		remain = quotient % -2
		quotient /= -2
		if remain < 0 {
			quotient++
			remain += 2
		}
		negaBinary = strconv.Itoa(remain) + negaBinary
	}

	fmt.Print(negaBinary)
}

💡 풀이

다른 진수 변환과 똑같이 몫이 0이 나올 때까지 나눠주면 된다. 다만 나머지가 음수일 때를 잘 처리해주어야 한다.

  1. 초기 몫은 문제에서 주어진 10진수 수이다.
  2. 몫이 0이 될 때까지 반복문은 돈다.
    1. 이전 몫을 -2로 나눌 때의 나머지와 몫을 구한다.
    2. 만약 나머지가 음수라면 몫에 1을 더하고, 나머지는 2를 더한다.
    3. 나머지를 결과 문자열 가장 왼쪽에 추가한다.

🔁 삽질

  • 음수 진수법 관련 이론을 잘 모른다면 삽질을 꽤나 많이 했을 것 같다. 다행히 구글에 관련 내용을 검색해봐서 나는 수월하게 풀었던 것 같다.
  • Go의 경우 나머지가 음수가 나올 수 있다. 이 때, 몫과 나머지를 적절히 조절해주어야 한다.
  • 음수 나눗셈은 언어마다 처리하는 방법이 다르다고 하니, 이 풀이가 정답은 아니다.

📖 새롭게 배운 내용

  • 음수 진수법
  • 음수 진수법 변환

💫 헷갈리는 부분

📚 참고 자료

Negative base - Wikipedia

profile
한 번 더 고민해보는 개발자

0개의 댓글