반응형

10699

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

 

10699번: 오늘 날짜

서울의 오늘 날짜를 출력하는 프로그램을 작성하시오.

www.acmicpc.net

[정답]

1
2
import datetime
print(str(datetime.datetime.now())[:10])
cs

.

.

.

[풀이]

datetime이라는 모듈을 이용한다.

몇시몇분몇초까지 나오기에 슬라이싱을 해준다.

 

p.s.

이런 모듈, 함수가 있는지 몰랐다.

사실 뭐, 알고리즘 문제 풀 때 쓸 일이 있을까 싶다.

반응형
반응형

https://replit.com/languages/python3

 

Python Online Compiler & Interpreter

Write and run Python code using our Python online compiler & interpreter. You can build, share, and host applications right from your browser!

replit.com

replit이라는 곳이다.

인터프리터 사이트 중 디자인이 제일 깔끔하다.

 

프로그램을 다운로드 받지 못하는 상황에서 유용하게 쓰고 있다.

로그인 필요X

다운로드 필요X

다른 언어도 가능O

p.s.

다운로드한 파일이 매번 초기화되는 공용 PC에서 이용하고 있다.

매번 visual studio code 다운받기 귀찮아서.

반응형
반응형

2530

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

 

2530번: 인공지능 시계

첫째 줄에 종료되는 시각의 시, 분, 초을 공백을 사이에 두고 출력한다. (단, 시는 0부터 23까지의 정수이며, 분, 초는 0부터 59까지의 정수이다. 디지털 시계는 23시 59분 59초에서 1초가 지나면 0시 0

www.acmicpc.net

[정답]

1
2
3
4
5
6
7
8
9
10
11
import sys
a, b, c = map(int,sys.stdin.readline().split())
= int(sys.stdin.readline())
+= s
+= c//60
c %= 60
+= b//60
b %= 60
a %= 24
 
print(a, b, c)
cs

.

.

.

[풀이]

a시간 b분 c초

초(c)부터 시작해서 60넘어가면 윗 단위로 올려준다.

 

p.s.

설명할게 없음

반응형
반응형

1158

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

 

1158번: 요세푸스 문제

첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000)

www.acmicpc.net

[정답]

1
2
3
4
5
6
7
8
9
10
11
12
import sys
N, K = map(int, sys.stdin.readline().split())
 
= [i for i in range(1,N+1)]
= []
= 0
while a:
  c += K-1
  if c >= len(a):
    c %= len(a)
  b.append(str(a.pop(c)))
print('<'", ".join(b), '>', sep = '')
cs

.

.

.

[풀이]

배열 a에서 c번(index)마다 항목을 삭제(pop)해준다.

pop해서 반환된 값을 b에 추가해준다.

 

이 때 배열 a에서 값들이 하나씩 삭제되므로

c는 K-1만큼만 증가시켜준다.

 

c가 배열 a의 길이보다 길어지면

처음으로 돌아가 카운트하는 순환 구조이므로

나머지 연산을 이용하여 c를 줄여준다.

 

p.s.

index를 계산하는 방법을 사용해야한다.

배열 자체를 pop과 append를 통해서 뗐다 붙였다 풀었더니

시간초과로 실패했다.

반응형
반응형

11170

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

 

11170번: 0의 개수

N부터 M까지의 수들을 종이에 적었을 때 종이에 적힌 0들을 세는 프로그램을 작성하라. 예를 들어, N, M이 각각 0, 10일 때 0을 세면 0에 하나, 10에 하나가 있으므로 답은 2이다.

www.acmicpc.net

[정답]

1
2
3
4
5
6
7
8
import sys
= int(sys.stdin.readline())
for t in range(T):
  N, M = map(int, sys.stdin.readline().split())
  c = 0
  for i in range(N,M+1):
    c += str(i).count('0')
  print(c)
cs

.

.

.

[풀이]

int형일 때는 0을 세기 힘들기 때문에

str형으로 변환해준 후

count()를 통해 각 문자의 '0'의 개수를 구한다.

 

p.s.

더 설명할게 없음

반응형
반응형

1292

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

 

1292번: 쉽게 푸는 문제

첫째 줄에 구간의 시작과 끝을 나타내는 정수 A, B(1 ≤ A ≤ B ≤ 1,000)가 주어진다. 즉, 수열에서 A번째 숫자부터 B번째 숫자까지 합을 구하면 된다.

www.acmicpc.net

[정답1]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import sys
a, b = map(int, sys.stdin.readline().split())
= 0
result = 0
for i in range(46):
  for j in range(i):
    c += 1
    if c >= a:
      result += i
    if c == b:
      break
  if c == b:
    break
print(result)
cs

.

.

.

[풀이1]

B<=1000이라는 조건이 있는데

수열이 1, 2, 2, 3, 3, 3, ... , 45, 45, 45, 45....에서 1000번째를 맞이한다.

따라서 for문 한계점을 46으로 설정한다.

그 후 평범한 반복문.

a번째부터 더하고 b번째에 break 한다.

.

.

.

[정답2]

1
2
3
4
5
6
7
import sys
a, b = map(int, sys.stdin.readline().split())
= []
for i in range(46):
  for j in range(i):
    c.append(i)
print(sum(c[a-1:b]))
cs

.

.

.

[풀이2]

파이썬의 기능을 이용하면 간략화할 수 있다.

모든 수를 배열에 집어넣은 후 sum함수로 값을 출력한다.

푼 사람들의 정답을 참조했다.

 

p.s.

brute force로 해보고 안되면 시간을 줄일 수 있는 알고리즘을 생각해보자.

반응형
반응형

19947

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

 

19947번: 투자의 귀재 배주형

2020년에 학교로 복학한 주형이는 월세를 마련하기 위해서 군 적금을 깨고 복리 투자를 하려고 한다. 주형이가 하려는 투자에는 3가지 방법의 투자 방식이 있다.  1년마다 5%의 이율을 얻는 투자 (

www.acmicpc.net

[정답]

1
2
3
4
5
6
7
8
9
10
11
12
import sys
H, Y = map(int,sys.stdin.readline().split())
dp = [0]*11
dp[0= H
for i in range(1, Y+1):
  if i>=5:
    dp[i] = int(max(dp[i-1]*1.05, dp[i-3]*1.20, dp[i-5]*1.35))
  elif i>=3:
    dp[i] = int(max(dp[i-1]*1.05, dp[i-3]*1.20))
  else:
    dp[i] = int(dp[i-1]*1.05)
print(dp[Y])
cs

.

.

.

[풀이]

각 연도에 따라 최적의 이율을 선택할 수 있어야한다.

따라서 동적계획법, dynamic programming으로 접근하여

최대의 값을 dp 배열에 저장해준다.

 

p.s.

매 해 다른 이율을 적용시킬 수 있다는 점을 놓쳐 문제를 틀렸다.

동적계획법으로 푸니 정말 쉽다.

반응형
반응형

24678

제 1회 실버컵 A

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

 

24678번: 돌무더기 게임 1

첫 번째 케이스에서 R의 첫 시행 이후 가능한 다음 상태는 $(0,0,2), (0,2,0), (2,0,0)$뿐이며, B는 더 이상 시행을 할 수 없으므로 이긴다. 두 번째 케이스에서 R의 첫 시행 이후 가능한 다음 상태는 다음

www.acmicpc.net

[정답]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import sys
= int(sys.stdin.readline())
for t in range(T):
    odd = 0
    even = 0
    a = list(map(int, sys.stdin.readline().split()))
    for i in range(3):
        if a[i] % 2 == 0:
            even += 1
        else:
            odd += 1
    if (even == 3 or even ==2):
       print('R')
    else:
       print('B')
cs

.

.

.

[풀이]

이기기 위한 최선의 수는 큰 값의 돌무더기 2개를 계속 선택하는 것이다.

 

이를 적용하여 T = 200,000  x, y, z <= 10^9 임에도 그냥 brute force로

for문을 이용하여 하나하나 더하고 빼고 해봤다.

결과는 당연히 시간초과 였다.

 

더 간단한 규칙을 찾아야함을 느꼈고

수기로 하나씩 적어가며 수가 움직이는 규칙을 살펴보았다.

어떤 수들의 조합이든

마지막에는 0, 0, 1 또는 0, 0, 2 되어 더이상 시행할 수 없게된다.

 

세 수가 짝수인지 홀수인지 즉,

짝짝짝

짝짝

홀홀

홀홀홀

에 따라서 마지막 수로 몇번의 시행(돌무더기 고르기)을 거치는지가 결정된다.

 

짝짝짝, 짝짝홀의 경우 짝수번의 시행을 거쳐 마지막에 도착하므로 승자는 R

홀홀, 홀홀홀의 경우 홀수번의 시행을 거쳐 마지막에 도착하므로 승자는 B

 

결국 수가 홀수인지 짝수인지로 구분하면 답이 나오는 문제가 되어버린다.

 

p.s.

처음 참여해본 백준 대회.

문제 난이도들이 어마무시했다.

그나마 풀 수 있을 거 같은 A번을 끄적끄적여봤다.

운 좋게 방법을 찾았고

좋은 풀이는 아닌거 같아 아쉬웠지만

대회 문제를 풀었다는 것에 크나큰 성취감을 느꼈다.

 

한문제 풀었더니 80등 했다. 

ㅎㅎ..

반응형

+ Recent posts