프로그래머스 문제중 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문으로 처리해 주었다.
'TIL' 카테고리의 다른 글
23/11/18 TIL __ 에러처리 미들웨어 구현 (0) | 2023.11.18 |
---|---|
23/11/17 TIL __ 시퀄라이즈 마이그레이션 수정 sequelize migration (0) | 2023.11.17 |
23/11/15 TIL __ 시퀄라이즈 테이블 조인하기 sequelize table join (2개 테이블) (0) | 2023.11.15 |
23/11/14 TIL __ 미들웨어로 로그인 인증하기 (access token) (0) | 2023.11.14 |
23/11/13 TIL __ 시퀄라이저 관계 설정. (0) | 2023.11.13 |