문제

https://www.acmicpc.net/problem/2753

 

2753번: 윤년

연도가 주어졌을 때, 윤년이면 1, 아니면 0을 출력하는 프로그램을 작성하시오. 윤년은 연도가 4의 배수이면서, 100의 배수가 아닐 때 또는 400의 배수일 때이다. 예를 들어, 2012년은 4의 배수이면서

www.acmicpc.net

어떤 연도를 입력했을 때 그 해가 윤년인지 아닌지를 구하시오(윤년이면 1, 아니면 0)

 

풀이

윤년이 뭔고 하니… 4의 배수 해가 되면 2월이 28일이 아니라 29일까지 있다. 그래서 윤년 끼면 내 생일이 2월 28일 다음날이 된다. 원래 윤년이 안 끼면 2월과 3월은 날짜가 같기 때문.

a=int(input())
if a % 4 == 0 and a % 100 != 0:
    print(1)
elif a % 400 == 0:
    print(1)
else: 
    print(0)

윤년의 조건은

  1. 4의 배수 해이면서 100의 배수가 아닌 해
  2. 400의 배수인 해

둘 중 하나이다. 그래서 저 조건에 부합하지 않으면 다 else로 처리하면 장땡. a % b는 a를 b로 나눈 나머지.

'BOJ > [BOJ] Python' 카테고리의 다른 글

백준 8393번 풀이  (0) 2022.08.18
백준 10950번 풀이  (0) 2022.08.18
백준 14681번 풀이  (0) 2022.08.18
백준 2884번 풀이  (0) 2022.08.18
백준 2588번 풀이 및 응용  (0) 2022.08.18

문제

https://www.acmicpc.net/problem/2884

 

2884번: 알람 시계

상근이는 매일 아침 알람을 듣고 일어난다. 알람을 듣고 바로 일어나면 다행이겠지만, 항상 조금만 더 자려는 마음 때문에 매일 학교를 지각하고 있다. 상근이는 모든 방법을 동원해보았지만,

www.acmicpc.net

기존 시각보다 45분 땡기기. 이게 한줄요약이다.

근데 나도 아침잠 많아서 알람 30분 땡기는데… 스누징 와 사실 그래도 피곤함… ㅋㅋㅋㅋㅋㅋ

 

풀이

일단 전제하고 가야 할 것이 있는데, 시간 계산은 일반적인 10진법이 아니다. 시간은 12진법(그래서 하루가 24시간), 분과 초는 각각 60진법이다. 그래서 10시 30분에서 45분을 빼게 되면

  1. 10:30-0:45
  2. 분이 -15분이 된다
  3. 시간에서 하나 받아내림한다 (시간은 9가 된다)
  4. 받아온 60분을 더하면 45분이 된다

이런 과정을 거치게 된다.

 

h,m=map(int,input().split(" "))
m=m-45
if m < 0: 
    h=h-1
    m=m+60
    print(h,m)
else: 
    print(h,m)

이건 일차적으로 분만 처리한 코드. 저거 그대로 내면 틀린다. 왜냐하면 위 논리대로 분에 대한 계산은 처리했으나, 시간에 대한 계산은 처리하지 않았기 때문에 0시 0분을 입력하게 되면 -1시가 나오게 된다.

 

h,m=map(int,input().split(" "))
m=m-45
if m < 0 and h != 0: 
    h=h-1
    m=m+60
    print(h,m)
elif m < 0 and h == 0: 
    h=h+23
    m=m+60
    print(h,m)
else: 
    print(h,m)

그래서 시간이 0시이면서 분에서 45를 뺐을 때 음수일 때에 대한 처리도 진행해야 한다. (24시간제라 23을 더했다. 0시를 다른 말로 24시라고도 하니까)

'BOJ > [BOJ] Python' 카테고리의 다른 글

백준 8393번 풀이  (0) 2022.08.18
백준 10950번 풀이  (0) 2022.08.18
백준 14681번 풀이  (0) 2022.08.18
백준 2753번 풀이  (0) 2022.08.18
백준 2588번 풀이 및 응용  (0) 2022.08.18

문제

https://www.acmicpc.net/problem/2588

 

2588번: 곱셈

첫째 줄부터 넷째 줄까지 차례대로 (3), (4), (5), (6)에 들어갈 값을 출력한다.

www.acmicpc.net

세 자리수의 곱셈에 대한 문제로, 순서대로 출력값이

  1. 일의 자리
  2. 십의 자리
  3. 백의 자리
  4. 전체 결과값

이 나오게 된다. 즉 123*456을 입력하면(물론 숫자 두 개로 입력받는다)

  1. 123 * 4
  2. 123 * 5
  3. 123 * 6
  4. 123 * 456

이렇게 네 가지로 출력하는 구조.

 

풀이

a=int(input())
b=input()
print(a*int(b[-1]))
print(a*int(b[-2]))
print(a*int(b[0]))
print(a*int(b))

어? 에디터 블록 켰더니 코드블록이 되네…? 무튼.

세자리수로 고정되어 있기 때문에 음수로 인덱싱해서 출력했다. input으로 입력받는 건 문자열이기때문에 int로 안 바꿔주면 결과값을 보자마자 여러분은 마른세수를 하게 된다. 문자열이 그냥 쭉 반복돼서 나오거든…

 

응용

-For문

a=int(input())
b=input()
for i in range(1,len(b)+1):
    print(a*int(b[len(b)-i]))
print(a*int(b))

반복문은 기본적으로 음수 인덱싱을 이용하지 않고, 별찍기때처럼 범위나 값에 변화를 줘서 진행할 예정이다. For문의 범위는 len(b)에서 뺄 값이기 때문에 1부터 숫자 자릿수+1로 잡았다. python의 range는 range(3)이면 길이는 3이지만 값이 0, 1, 2로 시작하기 때문.

 

-While문

a=int(input())
b=input()
i=len(b)
while i >= 1:
    print(a*int(b[i-1]))
    i=i-1
print(a*int(b))
a=int(input())
b=input()
i=len(b)
while i >= 1:
    i=i-1
    print(a*int(b[i]))
print(a*int(b))

둘 다 While이다.

for문과 while문은 같은 반복문이지만 맥락이 다르다. for문은 범위 안에서 반복하는 반복문이고, while은 특정 조건을 만족하기 전까지 반복하는 반복문. 그래서 돌아가는 용도에 따라 최적화된 반복문이 다르다.

'BOJ > [BOJ] Python' 카테고리의 다른 글

백준 8393번 풀이  (0) 2022.08.18
백준 10950번 풀이  (0) 2022.08.18
백준 14681번 풀이  (0) 2022.08.18
백준 2753번 풀이  (0) 2022.08.18
백준 2884번 풀이  (0) 2022.08.18

Profile

Lv. 34 라이츄

요즘 날씨 솔직히 에바참치김치꽁치갈치넙치삼치날치기름치준치학꽁치임..