<aside>
💬 lv0
, 비트 조작
정수로 이루어진 배열이 주어집니다. 이 배열에서 정확히 한 번만 나타나는 숫자를 찾아 반환하는 코드를 작성해주세요. 모든 숫자는 정확히 두 번 나타나는데, 오직 하나의 숫자만 한 번만 나타납니다.
입력 (배열) | 출력 (한 번만 나타나는 숫자) |
---|---|
[4, 1, 2, 1, 2] | 4 |
[2, 2, 1] | 1 |
배열 내에서 오직 한 번만 나타나는 숫자를 찾아 반환합니다. 예를 들어, 첫 번째 예시에서는 4가 한 번만 나타나므로 4를 반환합니다.
</aside>
def solution(nums): **#1 함수 정의**
result = 0 **#2 XOR 연산 결과 초기화**
for num in nums: **#3 숫자 탐색**
result ^= num **#4 XOR 연산 진행**
return result **#5 고윳값 반환**
함수 정의
코드의 첫 부분에서 solution
이라는 함수를 정의합니다. 이 함수는 하나의 인자 nums
를 받습니다. nums
는 오직 한 번만 나오는 단 하나의 숫자를 찾을 대상이 되는 배열입니다.
XOR 연산 결과 초기화
XOR 연산 결과 result
에 초깃값으로 0을 할당합니다.
숫자 탐색
배열 내 숫자를 num
변수에 할당하여 차례대로 숫자를 탐색합니다.
XOR 연산 진행
result ^= num
과 같이 XOR 연산을 진행하여 현재 탐색 숫자 num
이 기존에 나온 숫자와 겹치지는 않은지 연산을 진행합니다. 연산 방식은 비트를 이용해서 진행하며, 비트를 기준으로 현재 num
의 비트 전체가 result
의 비트의 일부와 겹친다면 현재 탐색 숫자가 기존에 나온 숫자와 중복됩니다. 그러면 result
의 비트에서 num
의 비트가 빼져서 기존 숫자가 상쇄됩니다. 갱신된 result
의 비트는 10진수 값으로 반환됩니다.
반면, num
의 비트가 result
의 비트와 겹치지 않는다면 result
의 비트에 num
의 비트를 추가하고, 갱신된 result
의 비트를 10진수 값으로 반환합니다.
고윳값 반환
for
문을 통해 모든 탐색 숫자는 XOR 연산이 진행되어 비트 조작으로 고윳값은 추가되고, 중복 값은 상쇄됩니다. 그 결과, 최종적으로 result
는 배열 nums
에서 오직 한 번만 나오는 단 하나의 숫자가 됩니다. 이러한 result
를 고윳값으로 반환합니다.
XOR 연산과 비트 조작
개념: XOR 연산은 2개의 연산 또는 명제 중 하나만이 참인 경우 참을 반환하는 연산입니다. 이러한 XOR의 특징을 숫자의 비트에 이용하면, 두 비트가 서로 다를 때 1을 반환하고, 두 비트가 서로 같으면 0을 반환할 수 있습니다. 이렇게 XOR 연산을 통해 비트를 비교하는 방식으로, 현재의 값이 기존의 값과 다르면 현재의 값을 고윳값으로 추가하고, 현재의 값이 기존의 값과 중복된다면 기존의 값을 빼서 상쇄할 수 있습니다.
data = [4, 1, 2, 1, 2]
def solution(arr):
result = 0
for num in arr:
result ^= num
return result
# XOR 연산
# result = result ^ num
# 0b 뒤의 bit가 서로 다르면 1을 반환, 같으면 0으로 바꿈
# 1st
result = 0 ^ 4 # 0b0
# 0b100
# 0b100 => 4 # 0 + 4
# 2nd
result = 4 ^ 1 # 0b100
# 0b1
# 0b101 => 5 # 4 + 1
# 3rd
result = 5 ^ 2 # 0b101
# 0b10
# 0b111 => 7 # 5 + 2
# 4th
result = 7 ^ 1 # 0b111
# 0b1
# 0b110 => 6 # 7-1
# 5th
result = 6 ^ 2 # 0b110
# 0b10
# 0b100 => 4 # 6-2
def solution(data): **#1 함수 정의**
uniq_d = set(data) **#2 고윳값 리스트 생성**
for num in uniq_d: **#3 고윳값 탐색**
num_count = data.count(num) **#4 배열 내 탐색 숫자의 개수**
if num_count == 1: **#5 실제 고윳값의 조건 정의**
return num **#6 실제 고윳값 반환**
함수 정의
코드의 첫 부분에서 solution
이라는 함수를 정의합니다. 이 함수는 하나의 인자 data
를 받습니다. data
는 오직 한번만 나오는 단 하나의 숫자를 찾을 대상이 되는 배열입니다.
고윳값 리스트 생성
set(data)
와 같이 set
함수를 이용하여 data
배열에서 중복되는 값들을 제거하고 고유한 값들만 남깁니다. 이렇게 생성된 고윳값 리스트를 uniq_d
라는 변수에 할당합니다.
고윳값 탐색
하지만 고윳값 리스트에 존재한다고 하더라도 기존 배열 data
에서 중복되는 값이 존재할 수 있습니다. 그러한 이유로 고윳값 리스트의 고윳값을 num
변수에 할당하여 순차적으로 탐색합니다.
배열 내 탐색 숫자의 개수
배열 data
에 count 메서드를 이용하여 배열 내 탐색 숫자 num
이 몇 개 존재하는 지 구하고 그 결과를 num_count
변수에 할당합니다.