1373번: 2진수 8진수 (브론즈1)
문제
정답
oct, int 함수를 사용하는 문제
내 정답1) 2진수를 10진수로 변환하고, 8진수로 변환하였으나 시간 초과로 오답처리 되었다.
보통 대부분 사람들이 이와 같은 flow로 문제를 해결하려고 한 것을 알 수 있었다.
풀이)
1. 2진수는 자릿수가 1,2,4,8,.. 이기 때문에 처음에 num을 1로 지정해주고 나중에 2씩 곱해준다.
2. 2진수 리스트의 가장 오른쪽 값부터 num 자릿수를 곱해주어 총 합으로 10진수를 구한다.
3. 10진수를 8로 나누어 나머지는 str 형태로 저장해둔다. (str로 하는 이유는 list 인덱싱할 때 join으로 합해주기 위해)
10진수를 8로 나눈 몫을 10진수 값으로 계속 업데이트 해주면서 0이 될때까지 반복해준다.
4. 밑에서부터 올라오기 때문에 reverse해주어 출력했다.
# 내 정답1
n = list(input()) #2진수 입력
#10진수 변환
num = 1
ans = 0
for i in range(len(n)):
ans += int(n[::-1][i]) * num
num *= 2
#8진수 변환
ans8 = []
while True:
aaa = ans%8 # 나머지
ans = ans//8 # 몫
if aaa == 0:
break
ans8.append(str(aaa))
# 리스트 출력
print(''.join(ans8[::-1]))
내 정답2) 2진수를 3자리씩 묶어서 8진수 한 자리로 만들 수 있는 아이디어를 활용했으나 똑같이 시간 초과로 오답처리 되었다.
풀이)
1. 앞서서 2진수를 10진수로 바꿔준 것과 비슷한 형식으로 진행한다.
2. 10진수로 바꾼 값을 arr 리스트에 저장해두고, arr 리스트 길이가 3개가 된다면, 즉 2진수 3자리 묶음이 완성된다면, 다시 자릿수와 10진수값을 리셋해주어 0의 상태로 돌아가 2진수를 다시 시작해준다.
이 방식을 2진수의 길이만큼 반복하여 진행한다.
위의 사진 예시로 보면, 111010011(2) -> [1,2,3,0,2,2,1,3,7] 이런식으로 저장된다. 3개 묶음씩 2진수를 10진수 값으로 변환하여 총 합인 마지막 세번째 숫자만 뽑아야 하는 것을 알 수 있다.
3. 그렇기 때문에 새로운 비어있는 리스트 arr2 에 3번째 값만 저장해주는 코딩을 했다.
4. 이를 reverse 해주면 8진수 값이 나온다.
# 내 정답2
n = list(input()) #2진수 입력
# 2진수 3개씩 묶어서 계산하여 8진수로 변환
num = 1
ans = 0
arr = []
arr2 = []
for i in range(len(n)):
ans += int(n[::-1][i]) * num
num *= 2
arr.append(ans)
if len(arr)%3 == 0:
num = 1
ans = 0
cnt = 3
for i in range(len(arr)//3+1):
arr2.append(str(arr[:cnt][-1]))
cnt += 3
print(''.join(arr2[::-1]))
<내가 생각하지 못한 아이디어>
1. int(a,b)
a 입력값을 b 진법으로 인식한다. b는 디폴트 10이기 때문에 a만 적는다면 자동으로 10진수로 인식한다.
int('0o12', 8) = 8진수 string 타입을 10진수 integer로 변환
2. oct(x)
정수 x를 입력받아 8진수로 변환하는 함수
8진수임을 맨 앞에 접두사 ' 0o'를 붙여서 표현하기 때문에 숫자만 출력하기 위해선 [2:]로 없애주어야 한다.
oct(int(5,2)) = 2진수 '5'를 10진수로 바꾼 뒤, 8진수로 변환
# 정답
print(oct(int(input(),2))[2:])
공부한 내용
oct(int(_,_))
외워두기만 하면 틀릴 일 없다!
레퍼런스
- 다른 풀이 참고
- 진수 공부
- 정답 깃허브
'Algorithm > 구현' 카테고리의 다른 글
[Python3] 백준 1063번 킹 (0) | 2023.03.31 |
---|---|
[프로그래머스 lv1] 크기가 작은 부분 문자열 (1) | 2023.01.25 |
[Python3] 백준 1357번 뒤집힌 덧셈 (0) | 2023.01.09 |
[Python3] 백준 1356번 유진수 (0) | 2023.01.09 |
[Python3] 백준 1296번 팀 이름 정하기 (0) | 2023.01.06 |
댓글