상세 컨텐츠

본문 제목

[Programmers] Lv.2 2개 이하로 다른 비트 (Go)

Development/Algorithm

by thisisnew 2022. 11. 13. 00:01

본문

반응형

https://school.programmers.co.kr/learn/courses/30/lessons/77885

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 설명

양의 정수 x에 대한 함수 f(x)를 다음과 같이 정의합니다.

  • x보다 크고 x와 비트가 1~2개 다른 수들 중에서 제일 작은 수

예를 들어,

  • f(2) = 3 입니다. 다음 표와 같이 2보다 큰 수들 중에서 비트가 다른 지점이 2개 이하이면서 제일 작은 수가 3이기 때문입니다.

  • f(7) = 11 입니다. 다음 표와 같이 7보다 큰 수들 중에서 비트가 다른 지점이 2개 이하이면서 제일 작은 수가 11이기 때문입니다.

정수들이 담긴 배열 numbers가 매개변수로 주어집니다. numbers의 모든 수들에 대하여 각 수의 f 값을 배열에 차례대로 담아 return 하도록 solution 함수를 완성해주세요.

 

제한사항

  • 1 ≤ numbers의 길이 ≤ 100,000
  • 0 ≤ numbers의 모든 수 ≤ 10^15

Solution

import (
	"math"
	"strconv"
)

func solution(numbers []int64) []int64 {
  	var result = make([]int64, len(numbers))

	for i, n := range numbers {

		if n%2 != 0 {
			result[i] = n + int64(math.Pow(2, getMinimalNumberHasDifBits(n)-1))
		} else {
			result[i] = n + 1
		}

	}

	return result
}

func getMinimalNumberHasDifBits(n int64) float64 {

	var result float64
	var binN = strconv.FormatInt(n, 2)

	for i := len(binN) - 1; i >= 0; i-- {

		if binN[i:i+1] == "0" {
			break
		}

		result++

	}

	return result
}

반응형

관련글 더보기

댓글 영역