목차
두 수 비교하기 (#1330)
- Hint
두 수를 비교할 시에 값이 같은 경우의 표현방법에 유의 한다 (==)
- Solution
조건문을 이용한 풀이
a,b = map(int, input().split())
if a > b:
print(">")
elif a < b:
print("<")
else:
print("==")
숏코딩 분석
a,b=map(int,input().split())
print(['><'[a<b],'=='][a==b])
[ ] 리스트 내의 조건문이 참인 경우와 거짓인 경우 각각 1 , 0이 출력됨을 이용하여 코드 길이를 짧게 했다.
시험 성적 (#1330)
- Hint
문제에서 주어진 숫자 범위에 주의한다.
- Solution
a = int(input())
if 90 <= a <= 100:
print('A')
elif 80 <= a < 90:
print('B')
elif 70 <= a < 80:
print('C')
elif 60 <= a < 70:
print('D')
else:
print('F')
숏코딩 분석
print('FFFFFFDCBAA'[int(input())//10])
입력값이 0에서 100 사이의 정수이고 출력 조건이 10을 단위로 달라지는 규칙을 이용하여 "//" 을 사용하여 10의 자리수를 인자로 한 리스트의 n번째 인수를 출력하는 식을 구성하였다.
윤년 (#2753)
- Hint
또는 과 그리고 가 어떤 표현에 사용되었는지 잘 구분하여야 한다.
a가 b의 배수 라는 사실은 a를 b로 나누었을때 나머지가 존재하지 않음을 생각해본다.
- Solution
a = input()
a = int(a)
if (a%4 == 0) and (a%100 != 0) or (a%400 == 0):
print('1')
else:
print('0')
사분면 고르기 (#14681)
- Hint
총 4개의 각각의 부호를 판별하는 조건문을 이용할 수도 있다.
- Solution
조건문 이용
a = int(input())
b = int(input())
if a >= 0:
if b >= 0:
print(1)
else:
print(4)
else:
if b >= 0:
print(2)
else:
print(3)
숏코딩 분석
print("3421"[input()>"0"::2][input()>"0"])
Python의 리스트 슬라이싱[ :: ]을 이용하여
첫 입력 값이 양수인 조건이
True = 1 인 경우에는 앞의 "3421" 리스트에서 4와 1
Fales = 0 인 경우에는 앞의 "3421" 리스트에서 3와 2 를 선택하고
마지막 입력 값이 양수인 조건일때
True = 1 인 경우에는 리스트의 1번째 상수를
Fales = 0 인 경우에는 리스트의 0번째 상수를 선택한다.
알람 시계 (#2884)
- Hint
시계는 하위 60이 상위 1임을 알고 있어야한다.
- Solution
조건문 이용
a,b = map(int, input().split())
resulthour = a
resultmin = b - 45
if resultmin < 0:
resultmin = resultmin + 60
resulthour = resulthour - 1
if resulthour < 0:
resulthour = resulthour + 24
print(f'{resulthour} {resultmin}')
시간이 변화할 경우를 조건문으로 이용하였다. 또한 resulthour 이 음수가 될 경우를 고려하여 조건문을 추가해주었다.
% 나머지 연산자 이용
hr,m=map(int,input().split())
print((hr-(m<45))%24,(m-45)%60)
직관적으로 이해하기 힘들수도 있지만
예로 들어, -45를 60 으로 나누었을 때 몫은 -1 나머지는 15가 되어 시간과 분 둘다 나머지를 이용하면 같은 결과값이 나오게 된다.
오븐 시계 (#2525)
- Hint
식에서 필요한 값을 얻기위해 어떤 과정에서의 결과값이 몫이 필요한지 나머지가 필요한지 생각해본다.
- Solution
조건문 이용 - 직접적인 방식
hr,m = map(int, input().split())
time = int(input())
result_min = m+time-60*((m+time)//60)
result_hour= (hr+((m+time)//60))-24*((hr+((m+time)//60))//24)
print(f'{result_hour} {result_min}')
// , % 몫, 나머지 연산자 이용
hr,m = map(int, input().split())
time = int(input())
print((hr+((time+m)//60))%24,((time+m)%60))
위의 시계 방식은 비슷하지만 hr 변수에 더해지는 carry 는 나머지가 아닌 몫을 더해주어야한다.
주사위 세개 (#2480)
- Hint
연산자를 잘 활용하여 코드의 복잡도를 줄일 수 있다.
- Solution
조건문 이용 - 직접적인 방식
a,b,c=map(int, input().split())
result=0
if a==b:
if b==c:
result=10000+a*1000
else:
result=1000+a*100
elif(a==c)or(b==c):
result=1000+c*100
else:
result=max(a,b,c)*100
print(f'{result}')
// , % 몫, 나머지 연산자 이용
*_,a,b,c=sorted(input())
print(['1'+b,c][a<b<c]+'000'[a<c:])
문제의 조건을 보면
- 같은 눈이 3개가 나오면 10,000원+(같은 눈)×1,000원의 상금을 받게 된다.
- 같은 눈이 2개만 나오는 경우에는 1,000원+(같은 눈)×100원의 상금을 받게 된다.
- 모두 다른 눈이 나오는 경우에는 (그 중 가장 큰 눈)×100원의 상금을 받게 된다.
각각의 결과값이 1n(000), 1n(00), n(00) 임을 알 수 있는데
이는 같은 눈이 3개인 경우엔 0이 3개 나머지 경우에는 0이 2개가 필요함을 알 수 있다.
또한 2개 이상 동일한 값이 나올 경우에 앞의 자리가 1이 되고 그 뒷 자리가 동일한 값이 배정됨을 알 수 있다.
다 다른 경우에는 최대값이 나온다.
일단 모두 다른 수가 나온다는 경우에서 최대 값을 구하기 위해서는 max 값이나 부호를 통한 비교도 가능한데
3번 이외에도 같은 눈을 선택해야되는 경우가 존재하니까 3번 조건인 max 함수와 1, 2번의 경우로 나누게 되면 길이가 길어지기 때문에 총 3개의 숫자중 2개 이상 중복되는 경우를 오름차순이나 내림차순등으로 나열할 경우 항상 가운데 자리에 중복되는 정수가 나타나기 때문에 이를 이용하면 숏코딩이 가능하다.
코드와 함께 설명해보면
*_,a,b,c=sorted(input())
*_ : 파이썬에서의 _ 사용법; 빈칸을 제거함(split() 보다 더 작은 바이트 수를 가지고 있어 이용)
a, b, c 를 sorted 함수를 이용하여 (default 세팅은 오름차순) 가장 크거나 같은 값이 c 가 됨
유형을 들어 설명해보면
['1'+b, c][a<b<c] 에서
[a<b<c]는 전부 다른 정수 일시 True = 1 이므로 앞의 리스트중 최대값인 c 가 선택되고
[a<b<c]는 전부 다른 정수가 아닐시 False = 0 이므로 앞의 리스트 중 '1' 과 그 중간값(중복값) 이 선택된다. 따라서 1n~ 꼴이 만들어진다.
+'000'[a<c:] 에서는
[a<c:] 의 a<c 가 참일시 True = 1 이므로 앞의 리스트 '000' 중 1번째 리스트 부터 끝까지 출력이 된다. -> 00
[a<c:] 의 a<c 가 거짓일시 False = 0 이므앞의 리스트 '000' 중 0번째 리스트 부터 끝까지 출력이 된다. -> 000
'Baekjoon > Stepbystep' 카테고리의 다른 글
[백준/python] 문자열 전체 풀이(6단계) (0) | 2022.07.31 |
---|---|
[백준/python] 함수 전체 풀이(5단계) (0) | 2022.07.29 |
[백준/python] 1차원 배열 전체 풀이(4단계) (0) | 2022.07.29 |
[백준/python] 반복문 전체 풀이(3단계) (0) | 2022.07.29 |
[백준/python] 입출력과 사칙연산 전체 풀이(1단계) (2) | 2022.07.29 |