TIL

23/11/16 TIL __ 3진법 뒤집기 (프로그래머스) feat. ^ xor연산자

GABOJOK 2023. 11. 16. 23:41

 

 

 

 

프로그래머스 문제중 3진법 뒤집기라는 문제를 함께 풀기로 했는데,

사실 3진법이 뭔지 몰라서 찾아봤다.

 

 

👻   10진법을 n진법 으로 바꾸기

 

우리가 보통 사용하는 수는 10진법이고,

3진법은 0, 1,2 까지 세고,

그 다음 자리수로 10 이렇게 올라가는 것이다.

 

10진법을 n진법 으로 변환하는 계산 방법을 보니,

10진법인 수를 n으로 나누고,

몫 부터 나머지 값들을 모아보면 n진법에 해당하는 숫자가 나오는 방식이다.

아래의 사진을 보면 좀더 이해가 쉬울 것 같다.

 

 

참고한 블로그(https://m.blog.naver.com/theo5970/221840365072)

 

 

그래서 while 문으로 문제에서 주어진 수 n을

3으로 나머지 연산을 하며

더하기 할당으로 풀어주었다.

이렇게 하면, 3진법인 수를 뒤집은 결과가 나오게 되는데, 

위 그림의 화살표 방향이 반대로 되어 결과값을 수집하고 있기 때문이다.

 

 

하지만 상관 없었다. 

문제에서 "앞뒤로 뒤집은 후" 라고 말했기 때문에

3진법으로 변환 및 뒤집는 연산은 이렇게 진행했다.

 

 

 

 

🐥   n진법을 10진법으로 바꾸기

 

 

만약 3진법으로 만들어진 수 210이 있다고 가정해 보자.

이런 경우 아래와 같이 생각하면 된다.

 

뒤에서부터 인덱스를 생각하면 쉬운데,

 

3의 2승         3의 1승           3의  0승

1                    2                    0

 

 

이렇게 한 뒤에, 

(1*  3의2승)   +   (2* 3의1승 )    +   (0* 3의 0승)

 

을 계산하면 된다.

참고로 거듭제곱 연산자는 **이다.

 

9 + 6 + 0 = 15

 

 

원리는 이렇다.

n진법으로 변환한 수에 0의 값이 있는 경우, 어차피 0이 나오기 때문에 계산하지 않아도 된다.

 

 

 

 

사실 거듭제곱 연산자와 ^ 연산자를 헷갈려서

문제를 원하는 방식으로 풀지 못했다.ㅎㅎ

🦋   ^연산자

두 개의 비트가 서로 다른 경우 1을, 같은경우 0을 반환한다.

XOR연산 이라고도 한다.

 

연산 결과
0 ^ 0 0
0 ^ 1 1
1 ^ 0 1
1 ^ 1 0

 

 

 

❗️❗️❗️기억하자❗️❗️❗️

거듭제곱 연산자는 **,  ^는 xor연산자!!(두 비트가 같으면 0, 다르면 1 반환)

 

 

 

 

 

 

 

그래서 다시 문제로 돌아와 보면,

아까 str 변수에 담은 값을 숫자 배열로 만들어 arr에 담아준 다음,

map을 통해 하나씩 돌면서 __(사실 forEach여도 상관 없을것 같다.)

연산을 시작했다.

 

문제는 거듭제곱 연산자에 들어갈 값을  뒤에서부터 인덱스를 센 값을 가져와야 하는데,

이 부분은 전체 배열의 길이에서, 1을 빼고, 현재 인덱스 값을 빼주었다.

1을 뺀 이유는 전체 길이는 항상 마지막 인덱스 값보다 1이 더 나오기 때문이다.

 

이제 arr의 요소 하나하나를 돌면서

해당 요소가 0이 아닐 경우만 연산 해 주기위해 if문으로 처리해 주었다.