코드업 100제 파이썬 오답노트
#1010. 정수 1개 입력받아 그대로 출력하기
입력: a = int(input())
출력: print(a)
#1011. 문자 1개 입력받아 그대로 출력하기
입력: a = str(input())
출력: print(a)
=>이게 안 먹히면
a = input()
print(str(a))
#1012. 실수 1개 입력받아 그대로 출력하기
입력: a = float(input())
출력: print(a)
=> 이상하게 파이썬은 소수점 아래 2번째까지만 나온다
#1013. 정수 2개 입력받아 그대로 출력하기
입력: a, b = input().split()
int(a)
int(b)
출력: print(a,b)
#1014. 문자 2개 입력받아 순서 바꿔 출력하기
입력: a, b = input().split()
int(a)
int(b)
출력: print(b,a)
#1015. 실수 소수점 셋째자리에서 반올림해서 출력
f = input()
print('%.2f' % float(f))
소수점 둘째자리까지 표시
a = 3.141592
print('%.2f' %a)
결과 : 3.14
#1017. 정수 1개 입력받아 공백을 사이에 두고 3번 출력하기
a = input()
print(a,a,a)
=> 찜찜한 부분 : int(a)를 넣으면 안 나온다. 왜?
=> ,를 넣으면 공백을 넣을 수 있다
#1018. 시간을 입력받아 그대로 출력하기
h, m = map(int, input().split(':'))
print('%d:%d' % (h,m))
=>map(a,b)는 b 각각에 a를 적용
=>'%d'에 %(h)를 넣는다
#1019. 연월일 입력받아 그대로 출력하기
y,m,d = map(int, input().split(".")) -> int를 뒤에 적용
print('%04d.%02d.%02d' %(y,m,d)) -> y,m,d를 각각 %d에 넣는다. 04, 02로 차지하는 칸 수
입력받은 연, 월, 일을 yyyy.mm.dd 형식으로 출력한다.
(%02d를 사용하면 2칸을 사용해 출력하는데, 한 자리 수인 경우 앞에 0을 붙여 출력한다.)
#1020. 주민번호 입력받아 - 없이 붙이기
a,b = map(int, input().split("-"))
print('%06d%07d'%(a,b))
#1023. 실수 1개 입력받아 부분별로 출력하기
a,b = input().split(".")
int(a)
float(b)
print(a)
print(b)
#1024. 단어 1개 입력받아 나누어 출력하기
data = input()
for i in data:
print("'"+i+"'")
-> 내 오답: for i in len(a):
print(a[i])
data = input()일 때 문자를 입력하기 때문에 이미 string이고
string은 리스트이기 때문에 바로 인덱싱이 가능하다.
그러므로 for문으로 바로 element를 하나씩 뽑아도 된다.
하나하나 인덱싱할 필요 없다!(물론 len(a)가 아니라 a라면 가능)
그리고 ''를 보이기 위해 "'"를 사용해야 한다
#1025.
data = input()
print([data[0]*10**4])
=> 이때 input은 int로 선언을 안해서 str으로 인식되어
data[0]값에 10000을 곱하는 것이 아닌 data[0]값이 10000번 나온다.
정답
data = input()
for i in range(len(data)):
print('['+str(int(data[i])*(10**(len(data)-(i+1))))+']')
=> len(data)의 길이만 넣으면 i(str)과 len(data)(int)가 안 맞음
그러므로 range()를 넣어줘야 한다.
str(int(data[i])*(10**(len(data)-(i+1))))
=> input의 하나하나를 뽑아서 숫자로 만든다
=> len(data) - (i+1) 빼서 10승
=> 숫자 곱하기 10승한 뒤 str로 나열
#1026.
%d 정수
%s 문자열
ex. name = "Amy"
print "Hello %s" %(name)
ex. day = 7
print "03-%s-2018" %(day)
print "03-%02d-2018" %(day)
=> 03 - 7- 2018
=> 03 - 07 - 2018
%01d/ %02d ...
=> 01, 02를 넣으면 1칸 , 2칸을 채우는 것
=> 남는 자리가 있으면 0이 들어감
=> 0을 넣지 않을 거면 01, 02이 아니라 %1d, %2d로 해야 함
=> d는 정수일 때만 가능. 그러므로 int로 바꿔주기
#1030. 10진 정수 1개 입력받아 8진수로 출력
유의점: 입력은 문자열로 된다. 그러므로 정수로 취급하기 위해 바꿔줘야 한다!
a = int(input())
o = oct(a)
=> '0o숫자' [문자열]
b = o[2:]
=> '숫자'[문자열]
print(int(b))
#1031. 10진 정수 입력받아 16진수로 출력하기 (소문자)
16진수는 0123456789abcdef로 표현
풀이1)
a = int(input())
h = hex(a)
b = h[2:]
print(b)
풀이2)
a = int(input())
print('%x' %a)
=> 풀이2는 바로 접두사 없이 출력된다
#1033. 10진 정수 입력받아 16진수로 출력하기 (대문자)
a = int(input())
print('%X' %a)
#1034. 8진 정수 1개를 입력받아 10진수로 출력하기
정수를 8진 정수로 입력받기: 앞에 '0o' 접두사를 붙여야 한다 또는 '%o' %input()
=> a = '0o' + input()
n진수를 10진수로 바꿀 때 : int('바꿀 숫자', n)
=> print(int(a,8))
=>유의: n은 주어진 숫자의 진수. 바꿀 진수가 아니라! 즉 이 방법은 10진수로 바꿀 때만 됨.
#1035. 16진 정수 1개를 입력받아 8진수로 바꾸기
정수를 16진 정수로 입력받기: 앞에 '0x' 접두사를 붙여야 한다.
하지만 input()값에 접두사를 더하면 문자열이고 n진수를 문자열이 아닌 진수로 인식해야 하기 때문에 잘못된 방법.
그러므로 input()를 10진수로 바꾼 뒤 8진수로 바꾸는 것이 더 바람직하다.
a = input()
b = int(a,16)
c = oct(b)
d = c[2:]
print(int(d))
[다른 풀이]
num = int(input(), 16)
print('%o' % num)
[진수 정리]
-int(): int(숫자)=> 10진수 정수로 바뀐다. int(n진수 문자열,10)에서 10이 생략된 형태이기 때문이다
그러므로 n진수의 수를 10진수로 바꾸고 싶으면 int(n진수 문자열, n)을 치면 된다
ex. 2진수: int('ob10110',2)
-다른 진수로 입력하기: 같은 숫자를 n진수로 인식하기 위해서는 앞에 접두사를 더한다
- 2진수: 0b10110 8진수: 0o52 16진수: 0x2a
-16진수는 10을 넘어갈 때부터 알파벳으로 표현된다: 0123456780abcdef
-10진수를 n진수로 바꾸기
1) bin(value), oct(value), hex(value)=> 접두사가 포함된다 (2진수, 8진수, 16진수)
2) format()함수: format(value, 'b') / format(value, 'o')/format(value, 'x')/
format(value,'X')/format(value, 'd') => 접두사 없이 해당 진수로 바꾼다
=> X는 16진수의 알파벳을 대문자로 바꾼다
접두사를 포함하고 싶으면 format함수에 #b, #o, #x, #X, #d를 사용한다
3) 여러 진수로 한꺼번에 바꾸기: "int: {0:d}, bin: {0:b}, oct: {0:o}, hex:{0:x}".format(value)
=> 마찬가지로 두번째 인자에 #을 더하면 접두사를 포함한다
4) 한 진수에서 다른 진수로 바꾸기: 1)과 같다. 다른 진수인 값을 접두사와 함께 value에 대입한다
5) '%b' %a/ '%o' %a/ '%x' %a/ '%X' %a/ '%d' %a
=> 앞의 형식에 맞춰 a가 들어간다
#1036. 아스키 코드
chr(숫자) : 숫자에 맞는 아스키 코드 반환 ex. a , A
ord(문자) : 아스키 코드 반환 ex. 97, 65
#1045. 정수 2개 입력 받아 연산하기
=> print(a,b,c,d)를 한 줄마다 넣고 싶으면
print(a,b,c,d, sep = '\n')
[답]
num1, num2 = map(int, input().split())
print(num1+num2, num1-num2, num1*num2, num1//num2, num1%num2, sep = '\n')
print('%.2f' % (num1/num2))
#1058. 정수 2개 입력(0,1)해서 둘 다 0이면 1, 아니면 0 반환하기
=> 참, 거짓을 입력해서 둘 다 거짓이면 참, 아니면 거짓 반환하기
b1, b2 = map(int, input().split())
print(1) if b1 == b2 == 0 else print(0)
=> b1 and b2 == 0 으로 하면 오답으로 나온다
b1 == b2 == 0으로 해야!
#1059~65. 비트 연산자
#1059. ~사용
num = int(input())
print(~num)
=> 파이썬은 2진수로 바꿀 필요 없이 바로 가능
from. dojang.io/mod/page/view.php?id=2460
파이썬 코딩 도장: 47.1 비트 연산자 사용하기
Unit 47. 부록 이제부터 부록입니다. 부록은 참고삼아 알아둘 내용, 자주 사용하지 않는 기능, 내용이 다소 어려운 부분, 파이썬을 어느 정도 알고난 뒤에 봐야할 내용 등을 담았습니다. 여기에 나
dojang.io
컴퓨터는 2진수(0과 1)를 사용하므로 대부분의 프로그래밍 언어는 2진수를 다루는 연산자를 제공합니다. 그런데 2진수로 변환하는 방법을 잘 모른다면 어떻게 해야 할까요? 걱정하지 않아도 됩니다. 파이썬에서는 간단하게 2진수와 10진수를 서로 변환할 수 있습니다.
1) 10진수와 2진수 변환하기
10진수를 2진수로 된 문자열로 변환할 때는 bin을 사용합니다. 반대로 2진수에서 10진수로는 입력 즉시 변환됩니다.
- bin(정수)
>>> bin(13) # 10진수 13을 2진수로 변환 '0b1101' >>> 0b1101 # 2진수 1101을 10진수로 변환 13
만약 2진수가 문자열 형태라면 int에 문자열과 2를 지정하여 10진수로 변환할 수 있습니다. 그리고 코드에서 2진수를 직접 입력할 때는 맨 앞에 0b를 붙입니다(binary의 b).
- int('2진수문자열', 2)
>>> int('1101', 2) # 2진수로 된 문자열 1101을 10진수로 변환 13
2) 비트 논리 연산자 사용하기
이제 2진수의 각 자릿수를 AND, OR, XOR, NOT 연산을 하는 비트 논리 연산자를 사용해보겠습니다.
- a & b
- a | b
- a ^ b
- ~x
>>> bin(0b1101 & 0b1001) # 비트 AND '0b1001'
>>> 13 & 9 # 비트 AND 9
>>> bin(0b1101 | 0b1001) # 비트 OR '0b1101'
>>> 13 | 9 # 비트 OR 13
>>> bin(0b1101 ^ 0b1001) # 비트 XOR '0b100'
>>> 13 ^ 9 # 비트 XOR 4
>>> bin(~0b1101) # 비트 NOT '-0b1110'
>>> ~13 # 비트 NOT -14
3) 비트 연산자 진리표
&, |, ^, ~ 연산자로 각 비트를 연산했을 때의 결과(진리표)는 다음과 같습니다. 진리표의 내용이 많아 보여도 각 연산자의 특성만 이해하면 진리표 전체를 외우지 않아도 됩니다.
and/ or/ 배타적(1이 -1이라고 생각하면 쉬움. 둘이면 0이 되고 하나만 있으면 1, 없으면 0) / 반대
▼ 표 47-1 &, |, ^, ~의 연산 결과
연산자 |
비트1 |
비트2 |
결과 |
& |
0 |
0 |
0 |
0 |
1 |
0 |
|
1 |
0 |
0 |
|
1 |
1 |
1 |
|
| |
0 |
0 |
0 |
0 |
1 |
1 |
|
1 |
0 |
1 |
|
1 |
1 |
1 |
|
^ |
0 |
0 |
0 |
0 |
1 |
1 |
|
1 |
0 |
1 |
|
1 |
1 |
0 |
|
~ |
0 |
|
1 |
1 |
|
0 |
예를 들어 & 연산자는 비트 AND이므로 두 값이 모두 1일 때 1입니다. 따라서 하나라도 0이면 0이 나옵니다. 즉, 0b1101과 0b1001을 비트 AND 연산했을 때 0 & 1은 0 그리고 1 & 1은 1이 나오므로 0b1001이 됩니다. 10진수로 표현하면 13 & 9는 9가 되겠죠?
>>> bin(0b1101 & 0b1001) 0b1001 >>> 13 & 9 9
다음과 같이 비트 논리 연산자는 각 자릿수를 연산하여 결과를 만듭니다. 이때 각 자릿수의 연산 결과는 다른 자릿수에 영향을 미치지 않습니다.
▼ 그림 47-2 비트 단위 연산
#1063. 3항 연산자
a, b = map(int,input().split())
print(a if a>b else b)
파이썬 3항 연산자 비교
여느 언어에나 코드 량을 줄이기 위한 다양한 기법들이 존재합니다. 그 중에서 대표적인 것 중 하나인 3 항 연사자를 파이썬에서도 사용가능 합니다. 파이썬 언어의 장점 중에 하나가 타 언어에
blueshw.github.io
1. and 와 or 를 이용한 3 항 연산자
# result = condition and when True or when False;
a = 10
b = 20
result = a == b and a-b or a+b # 결과는 a+b = 30
삼항 연산자의 condition 이 True 면
and 뒤의 연산이 return 되고,
condition 이 False 면
or 뒤의 연산이 return 됩니다.
=>C 나 Java 에서 사용하는 방식과 동일한 형태이지만,
단지 '?'가 'and'가 되고, ':'가 'or'가 되는 것입니다.
그런데 위 설명을 잘 뜯어보면 어딘가 문제가 있습니다. 어떤 문제인지 확인하기 위해 아래 예제를 살펴보겠습니다.
a = 10
b = 10
result = a == b and a-b or a+b # 결과는 a+b = 20 ???????
a 가 10 이고 b 가 10 일때 a == b 는 True 가 되므로 result 는 당연히 a-b = 10 이 되야 하는데, 결과는 a+b = 20 이 되었습니다. 왜 그런걸까요? 3 항 연산자 공식에 문제는 없어 보이는데 말이죠.
문제는 a and b or c 에서 b 가 0 일때 발생합니다. 무슨말이냐면, 컴퓨터 과학에서 0 이라는 것은 False 를 의미하기도 하죠. 그래서 a 가 True 라고 해도 b 가 0 이 되면 False 로 인지되기 때문에 결국에는 C 를 리턴하게 되는 것입니다. 왜 이런 문제가 발생하도록 3 항 연산자를 만들었는지 모르겠습니다만, 아마도 이 문제를 보완하기 위해서 파이썬 2.5 버전부터 if 와 else 를 사용한 3 항 연산자를 새로 만들게 된것 같습니다.
2. if 와 else 를 이용한 3 항 연산자
# result = when True if condition else when False;
a = 10
b = 20
result = (a-b) if a == b else (a+b) # 결과는 a+b = 30
if 문을 이용한 3 항 연산자는 파이썬 언어의 특징을 잘 보여줍니다. 결과가 먼저 나와 있고, 그 뒤에 조건(condition)이 있습니다. 만약 이 조건이 참이면 그대로 맨처음 연산을 리턴하고, 거짓이면 마지막 else 뒤의 연산을 리턴하게 됩니다. 이해하기 어렵지는 않습니다만, 처음 파이썬을 접한 사람들에게는 조금 생소한 코드 형태일 수도 있는데요. 일반적으로 사용하는 3 항 연산자와 구조가 달라서 그럴지도 모릅니다. 하지만 파이썬에 익숙해지다 보면, 금방 익숙해 질 수 있습니다.
이러한 형태의 코드는 for 문을 사용하여 list 를 만들때도 비슷하게 적용할 수 있는데요.
list = [ idx for idx in range(10)] # list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
루프의 결과를 맨앞에 나열하고 그 뒤에 조건이나 for 문을 나열하여 여러 줄로 만들어야 할 코드를 한줄로 만들어 버렸습니다. 보통 다른 언어에서는 두줄내지 세줄은 할애해야 할텐데 파이썬에서는 단 1 줄로 쉽게 처리할 수 있습니다. 아마 이러한 코드가 파이썬이 추구하는 형태의 코드 스타일이 아닐까 생각합니다. 이 외에도 튜플을 만들때나 두 변수간의 값을 교환할 때도 다른 언어와는 다르게 훨씬 간단하게 처리할 수 있습니다(직접 찾아보시길).
결론 :
and 와 or 를 이용한 3 항연산자는 가급적 지양하고, if 와 else 를 이용한 3 항 연산자에 익숙해지자!
#1070. if조건문과 or 연산자
if n == a or b:
=> 이렇게 식을 세우는 경우 or는 앞뒤의 a,b를 불리언으로 이해해 참, 거짓으로 이해한다
그러므로 n == a or n == b라고 식을 세워야 한다
month = int(input())
if month in (12, 1, 2):
print('winter')
elif month in (3,4,5):
print('spring')
elif month in (6,7,8):
print('summer')
else:
print('fall')
=> 하나하나 or로 넣기보다 튜플 안에 있는지 확인하는 것이 빠르다
#1071. 리스트에서 삭제하기
list.remove(): 삭제하고 싶은 값을 넣어 가장 처음에 나오는 인자를 삭제한다
del list[]: 인덱스를 이용해 삭제한다 -> 속도가 pop보다 조금 더 빠르다
list.pop(): 가장 마지막 값을 삭제하고 반환한다. 인덱스를 넣으면 해당 값을 삭제한다.
.rstrip('\n'): 개행문자(줄바꿈) 삭제하기
[풀이]
n = int(input())
data = list(map(int, input().split()))
로 줄별로 다른 변수를 주기만 해도 다르게 정의된다.
#1074.
while반복문:
while반복문 아래 있는 조건들이
while 조건을 충족하지 않을 때까지
위에서 아래로 반복된다
#1075
ascii code: 소문자 a = 97~
print()할 때 줄 바꾸지 않기: print(a, end = " ") => 스페이스만 있다
#1076.
a(97)~z(122)
apb = input()
for i in range(97, ord(apb)+1):
print(chr(i), end = ' ')
#1079.
input().split()해야 여러 가지가 하나씩으로 나뉜다
#1080.
=> sum이 반복문 안에 있으면 계속 0으로 리셋되니까 밖에 정의하기(전역변수)
num = int(input())
sum = 0
for i in range(1, 46):
sum = sum + i
if sum >= num:
print(i)
break
#1081.
'전체 %d' %(넣을 값)
#1082.
n = input()
m = int(n,16)
for i in range(1, 16):
h = m*i
print('%s * %X =%X' %(n,i,h) )
round(소수, n) => n번째까지 반올림해서 표현
#1091.
반복문에서 마지막 값만 보이고 싶으면
print()를 반복문이 끝난 후에 적는다
즉 for i in range(10):
print(i)가 아닌
for i in range(10):
print(i)로
#1092.
a,b,c = map(int, input().split())
d = 0
while True:
d = d+1
if d%3 ==0 and d%7 ==0 and d%9 ==0:
break
print(d) -> 위 while을 끝내고 print를 해야 여러개 나오지 않는다
#1093. 리스트.count(요소) => 찾는 요소의 개수를 알려준다
list = list(map(int, input().split())
for i in range(1,24):
print(list.count(n), end=" ")
#1094. 리스트.reverse()는 해당 리스트를 뒤집음. 다른 리스트를 만드는 것이 아니다.
n = input()
data = list(input().split())
data. reverse()
for d in data:
print(d, end = " ")
#1095. 리스트에서 가장 작은 숫자 찾기
min() 또는
data = list(map(int, input().split()))
m = 24
for d in data:
if d<m:
d= m
print(m)
#1096. 바둑판 만들기
stone_stage = [[0]*19 for _ in range(19)]