반응형

2512

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

 

2512번: 예산

첫째 줄에는 지방의 수를 의미하는 정수 N이 주어진다. N은 3 이상 10,000 이하이다. 다음 줄에는 각 지방의 예산요청을 표현하는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 값들은 모두 1 이상

www.acmicpc.net

[정답]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import sys
= int(sys.stdin.readline())
= list(map(int, sys.stdin.readline().split()))
= int(sys.stdin.readline())
= 0
a.sort()
start = 0
last = a[-1]
while (start <= last):
  mid = (start + last)//2
  asum = 0
  for i in range(len(a)):
    if a[i] < mid:
      asum += a[i]
    else:
      asum += mid
  if asum > M:
    last = mid -1
  else:
    start = mid+1
print(last)
cs

.

.

.

[풀이]

이분탐색 문제. 

이분탐색 루프를 설정하고 for문으로 mid 전 후 값을 따로 합하여 M과 비교한다.

마지막에 예산 중 최댓값을 출력하기 위해 last 값을 출력한다.

 

p.s.

이분탐색으로 하면 되는 줄 모르고 for로 처음부터 반복했더니 런타임에러가 떴다.

무식하게 하면 안된다.

런타임에러 뜰 때면 이분탐색을 시도해보자.

반응형
반응형

1417

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

 

1417번: 국회의원 선거

첫째 줄에 후보의 수 N이 주어진다. 둘째 줄부터 차례대로 기호 1번을 찍으려고 하는 사람의 수, 기호 2번을 찍으려고 하는 수, 이렇게 총 N개의 줄에 걸쳐 입력이 들어온다. N은 50보다 작거나 같

www.acmicpc.net

[정답]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import sys
= int(sys.stdin.readline())
= []
= 0
for i in range(N):
    a.append(int(sys.stdin.readline()))
 
while(max(a) != a[0]):
    a[a.index(max(a))] -= 1
    a[0+= 1
    c += 1
 
if a.count(max(a)) >= 2:
    print(c+1)
else:
    print(c)
cs

.

.

.

[풀이]

득표수를 배열 a로 입력받는다.

배열에서 가장 큰 값을 1씩 빼주고, 다솜이의 값, a[0]을 1씩 증가시켜준다.

a[0]가 최댓값이 될 때까지 반복.

c로 횟수 카운트.

 

동득표율을 방지하기 위해 최댓값의 수가 2개 이상이면 횟수 1번 증가.

 

p.s.

특별할 것 없는 문제.

반응형
반응형

11727

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

 

11727번: 2×n 타일링 2

2×n 직사각형을 1×2, 2×1과 2×2 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×17 직사각형을 채운 한가지 예이다.

www.acmicpc.net

[정답]

1
2
3
4
5
6
7
8
import sys
= int(sys.stdin.readline())
dp = [-1]*1001
dp[1= 1
dp[2= 3
for i in range(3,N+1):
    dp[i] = dp[i-2]*2 + dp[i-1]
print(dp[N]%10007)
cs

.

.

.

[풀이]

dp로 풀면 되는 간단한 문제.

점화식을 세우기 위해 i = 1, 2, 3, 4까지 일일이 해봤다.

dp[i] = dp[i-2]*2 + dp[i-1] 라는 규칙만 파악하면 된다.

 

타일이 있니 뭐니 하는 것은 그저 복잡하게 보이려는 눈속임일 뿐.

 

p.s.

약 4개월만에 백준을 풀었다.

파이썬보다 C++에 관심이 생겨 공부중이다.

파이썬을 까먹지 않도록 매일 한 문제씩 풀 예정이다.

반응형
반응형

11728

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

 

11728번: 배열 합치기

첫째 줄에 배열 A의 크기 N, 배열 B의 크기 M이 주어진다. (1 ≤ N, M ≤ 1,000,000) 둘째 줄에는 배열 A의 내용이, 셋째 줄에는 배열 B의 내용이 주어진다. 배열에 들어있는 수는 절댓값이 109보다 작거

www.acmicpc.net

[정답]

1
2
3
4
5
6
7
import sys
N, M = map(int, sys.stdin.readline().split())
= list(map(int, sys.stdin.readline().split()))
= list(map(int, sys.stdin.readline().split()))
= a + b
a.sort()
print(' '.join(map(str, a)))
cs

.

.

.

[풀이]

배열끼리도 + 를 통해 합치기가 가능하다.

' '.join(map(str, a)로 a를 문자열로 출력 가능하다.

 

p.s.

다음에는 어려운 문제 풀이로 돌아오겠다.

한동안 활동 못할 예정이다.

반응형
반응형

1789

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

 

1789번: 수들의 합

첫째 줄에 자연수 S(1 ≤ S ≤ 4,294,967,295)가 주어진다.

www.acmicpc.net

[정답]

1
2
3
4
5
6
7
8
= int(input())
= 1
while True:
    if n*(n+1)/2 > S:
        break
    else:
        n += 1
print(n-1)
cs

.

.

.

[풀이]

쉬운 문제.

while문으로 풀었다.

1 부터 n까지의 합을 구하는 수식을 이용했다.

 

p.s.

일이 생겨서 한달간 문제 풀이를 못 할 것 같다.

반응형
반응형

5635

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

 

5635번: 생일

어떤 반에 있는 학생들의 생일이 주어졌을 때, 가장 나이가 적은 사람과 가장 많은 사람을 구하는 프로그램을 작성하시오.

www.acmicpc.net

[정답]

1
2
3
4
5
6
7
8
import sys
= int(sys.stdin.readline())
= []
for n in range(N):
    a.append(list(sys.stdin.readline().strip().split()))
= sorted(a, key = lambda x: (int(x[3]), int(x[2]), int(x[1])))
print(a[N-1][0])
print(a[0][0])
cs

.

.

.

[풀이]

입력받은 값을 정렬하여 마지막값, 첫값 출력.

sorted()를 사용한다.

key = lambda로 연도, 월, 일 순으로 정렬할 것을 지정해준다.

 

p.s.

sorted() 사용법 복습

반응형
반응형

1449

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

 

1449번: 수리공 항승

첫째 줄에 물이 새는 곳의 개수 N과 테이프의 길이 L이 주어진다. 둘째 줄에는 물이 새는 곳의 위치가 주어진다. N과 L은 1,000보다 작거나 같은 자연수이고, 물이 새는 곳의 위치는 1,000보다 작거나

www.acmicpc.net

[정답]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import sys
N, L = map(int, sys.stdin.readline().split())
= list(map(int, sys.stdin.readline().split()))
a.sort()
= 1
temp = 0
= 1
while (i < N):
    if a[i] - a[i-1+ temp < L:
        temp = a[i] - a[i-1+ temp 
        i += 1
    else:
        temp = 0
        i += 1
        c += 1
print(c)
cs

.

.

.

[풀이]

while문을 이용하여 풀었다.

고장난 파이프 사이 거리가 L보다 작으면 temp에 거리들을 더해간다. c는 그대로.

L이상이 되면 c를 증가시켜주고 temp를 초기화시켜준다.

 

p.s.

더 설명할게 없는 초보 문제.

반응형
반응형

7785

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

 

7785번: 회사에 있는 사람

첫째 줄에 로그에 기록된 출입 기록의 수 n이 주어진다. (2 ≤ n ≤ 106) 다음 n개의 줄에는 출입 기록이 순서대로 주어지며, 각 사람의 이름이 주어지고 "enter"나 "leave"가 주어진다. "enter"인 경우는

www.acmicpc.net

[정답]

1
2
3
4
5
6
7
8
9
10
11
12
import sys
= int(sys.stdin.readline())
= {}
for n in range(N):
    name, status = map(str, sys.stdin.readline().split())
    if status == 'enter':
        a[name] = '1'
    elif status == 'leave':
        del a[name]
= sorted(a.keys(), reverse = True)
for i in a:
    print(i)
cs

.

.

.

[풀이]

간단한 문제 같아 보여 처음엔 리스트를 이용하여 풀었다.

append()와 remove()를 이용하여서.

그런데 시간초과가 떴다.

이유는 remove()의 시간 복잡도가 O(n)이라 

for문을 생각하면 전체 시간 복잡도가 O(n^2)이 된다고 한다.

그래서 시간 초과가 뜨는 거라고 하는데 아직 시간 복잡도는 조금 더 공부해봐야할 것 같다.

 

아무튼 이 문제를 해결하려면 해싱, hashing을 이용하여야 한다고 질문글에서 봤다.

해싱은 무엇인가.

모르겠다.

공부해야할게 또 생겼다.

마침 자료구조와 여러 알고리즘들이 잘 설명되어 있는 블로그를 찾았다. 

한동안은 그 블로그를 보면서 공부할 생각이다.

 

해싱을 몰라도 파이썬에선 간단히 해결할 수 있다.

왜냐하면 파이썬의 딕셔너리가 해시로 구현되어 있기 때문이라고 한다.

따라서 딕셔너리로 del 과 sorted()를 이용해서 풀면 기초 수준의 문제로 난이도가 하락한다.

 

p.s.

장황하게 얘기했는데 요약하자면

1. 시간복잡도를 공부하자

2. 해싱을 공부하자

3. 알고리즘 블로그 공부한다고 ps(problem solving)가 뜸해질 수 있다.

반응형

+ Recent posts