문제
https://www.acmicpc.net/problem/14561
사용 언어
Python3
풀이 과정
처음 풀었던 코드이고 예제 입력 시 출력은 맞았는데 제출했더니 틀렸습니다! 어디가 잘못된 건지 테스트 케이스를 changeNum 함수에 대입해 직접 출력한 거랑 계산기 값이랑 비교해봤는데 16진수 변환 시 HEX 값은 '53A69'지만 내 코드에서는 '531069'로 출력되는 것을 확인했다... 11진수부터는 10 이상을 출력하기 때문에 A~F라는 문자가 출력되는 것을 깜빡한 것~~~ 브론즈 II도 까다롭구나😂
import sys
def changeNum (num, base) :
changed = []
while(num >= base) :
changed.append(str(num % base))
num = num // base
changed.append(str(num)) # 마지막 숫자까지 넣기
print(''.join(reversed(changed)))
return ''.join(reversed(changed))
def isPalindrome (number) : # 문자열로 받음
for i in range(0, len(number)//2):
if number[i] == number[-i-1] :
continue
else :
return 0
return 1
t = int(sys.stdin.readline()) #테스트 케이스 수 입력
result = []
for i in range(0, t) :
A, n = map(int, sys.stdin.readline().strip().split(' ')) # 개행 문자 없애기 위해 strip 함수 사용
result.append(isPalindrome(changeNum(A, n)))
print(*result, sep='\n')
그래서 10~16까지에 해당하는 A~F 문자열 배열도 만들어서 changeNum 함수를 아래와 같이 수정했지만 또 틀렸습니다!
def changeNum (num, base) :
changed = []
overTen = ['A', 'B', 'C', 'D', 'E', 'F'] # 10~16
while(num >= base) :
mod = num % base
if (mod >= 10) : # 나머지가 10보다 크면
changed.append(overTen[mod%10])
else :
changed.append(str(mod))
num = num // base # 나눠진 후의 몫을 저장
changed.append(str(num)) # 마지막 몫까지 넣기
return ''.join(reversed(changed)) # 순서를 반대로 join
그래서 A~F가 들어간 숫자 위주로 테스트를 해보니 10 이상의 첫 번째 숫자는 변환이 안되는 것을 확인...
내가 while문 범위를 괜히 저렇게 설정해서 마지막 몫 넣기를 따로 뺀 게 문제였다..ㅎㅎ;;
해당 부분 수정하고 제출하니 드디어 뜬 맞았습니다!!
제출 답안
import sys
def changeNum (num, base) :
changed = []
overTen = ['A', 'B', 'C', 'D', 'E', 'F'] # 10~16
while(num > 0) :
mod = num % base
if (mod >= 10) : # 나머지가 10보다 크면
changed.append(overTen[mod%10])
else :
changed.append(str(mod))
num = num // base # 나눠진 후의 몫을 저장
return ''.join(reversed(changed)) # 순서를 반대로 join
def isPalindrome (string) : # 문자열로 받음
for i in range(0, len(string)//2):
if string[i] == string[-i-1] : # 대칭되는 위치 비교
continue # 같으면 다음 위치 비교
else :
return 0 # 하나라도 틀리면 for문 탈출
return 1
t = int(sys.stdin.readline()) #테스트 케이스 수 입력
result = []
for i in range(0, t) :
A, n = map(int, sys.stdin.readline().strip().split(' ')) # 개행 문자 없애기 위해 strip 함수 사용
result.append(isPalindrome(changeNum(A, n)))
print(*result, sep='\n') # 결과값 출력
공부한 내용
reverse와 reversed의 차이
파이썬에서 리스트의 요소를 뒤집어야 할 때 주로 reverse와 reversed를 이용한다. 이전에 공부했던 sort와 sorted의 차이와 비슷하다.
1. reverse
reverse는 list 타입에서 제공하는 함수로 list.reverse()의 형식으로 사용, 튜플이나 딕셔너리 혹은 문자열에는 사용 불가능
리스트 값을 반환하는 것이 아니라 변환시켜주는 것이므로 print(list.reverse()) 혹은 var = list.reverse()와 같이 사용할 수 없음!!!
2. reversed
reversed는 list에서 제공하는 함수가 아니라 파이썬의 내장함수이다.
리스트, 튜플, 문자열 등 시퀀스 자료형에 사용할 수 있고 딕셔너리는 순서가 있는 타입이 아니므로 지원하지 않는다.
추가로 문자열에 reversed 함수를 사용하면 list_reverseiterator 타입으로 반환되기 때문에 변환한 값을 출력하기 위해서는 join을 같이 사용해주어야 한다.
l = ['a', 'b', 'c']
j = ''.join(l)
rj = ''.join(reversed(l))
print(j) # 'abc'
print(rj) # 'cba'
출처: https://velog.io/@code_angler/Python%ED%8C%8C%EC%9D%B4%EC%8D%AC-reverse-%EC%99%80-reversed%EC%9D%98-%EC%B0%A8%EC%9D%B4-and-%EB%A6%AC%EC%8A%A4%ED%8A%B8-%ED%8A%9C%ED%94%8C%EC%9D%84-%EB%AC%B8%EC%9E%90%EC%97%B4%EB%A1%9C-%EB%A7%8C%EB%93%A4%EA%B8%B0by.-join
sys.stdin.readlin()의 개행문자를 지우려면
sys.stdin.readline()이 input() 함수보다 입출력 시간이 줄어든다는 소리에 이번 문제풀이부터 바로 적용해보았다.
그런데 split() 함수로 원하는 문자열을 추출하려고 하니 개행문자가 포함되어 출력되는 것이 아닌가..!!
이럴 때 strip() 함수를 사용하면 문자열 맨 앞과 맨 끝의 공백문자를 제거해서 반환해준다.
추가로 문자열을 여러 줄 입력받아 사용하려고 할 때도 필요할 수 있다.
출처: https://velog.io/@yeseolee/Python-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%85%EB%A0%A5-%EC%A0%95%EB%A6%ACsys.stdin.readline
다른 사람 답안
아무래도 더 간결한 답안이 있을 것 같아 배울 점이 있는 코드를 찾아보았다.
import sys
sys.stdin = open("input.txt", 'r')
for _ in range(int(input())):
A, n = map(int, input().split())
s = ''
while A >= n:
s = str(hex(A%n)[2:]) + s
A //= n
s = str(hex(A)[2:]) + s
print(s)
print(int(s == s[::-1]))
출처: https://home-body.tistory.com/546
문제가 조금 바뀌었는지 input.txt 파일을 사용했고 잘 작동하는 것 같지는 않지만 어쨌든 //= 연산자가 가능하다는 것을 처음 알았다. 간단한 예제를 시도해보니 잘 작동했다.
a = 6
b = 2
a //= b
print(a) # 3
그리고 문자열이나 리스트를 거꾸로 출력할 때 인덱싱을 이용해 [::-1]을 사용하는 것이 더 간편할 수 있다는 것을 확인했다.
x = ['1', '2', '3', '4', '5']
y = ''.join(x[::-1])
print(y) # 54321
'코딩 테스트 스터디 > 백준' 카테고리의 다른 글
[실버 IV] 2108번. 통계학 (0) | 2022.02.06 |
---|---|
[브론즈 III] 3009번. 네 번째 점 (0) | 2022.02.04 |
[브론즈 II] 2577번. 숫자의 개수 (0) | 2022.01.31 |
[브론즈 II] 2775번. 부녀회장이 될테야 (0) | 2022.01.30 |
[실버 IV] 9012번. 괄호 (0) | 2022.01.26 |