728x90

문제

다솜이는 0과 1로만 이루어진 문자열 S를 가지고 있다. 다솜이는 이 문자열 S에 있는 모든 숫자를 전부 같게 만들려고 한다. 다솜이가 할 수 있는 행동은 S에서 연속된 하나 이상의 숫자를 잡고 모두 뒤집는 것이다. 뒤집는 것은 1을 0으로, 0을 1로 바꾸는 것을 의미한다.

예를 들어 S=0001100 일 때,

  1. 전체를 뒤집으면 1110011이 된다.
  2. 4번째 문자부터 5번째 문자까지 뒤집으면 1111111이 되어서 2번 만에 모두 같은 숫자로 만들 수 있다.

하지만, 처음부터 4번째 문자부터 5번째 문자까지 문자를 뒤집으면 한 번에 0000000이 되어서 1번 만에 모두 같은 숫자로 만들 수 있다.

문자열 S가 주어졌을 때, 다솜이가 해야하는 행동의 최소 횟수를 출력하시오.

입력

첫째 줄에 문자열 S가 주어진다. S의 길이는 100만보다 작다.

출력

첫째 줄에 다솜이가 해야하는 행동의 최소 횟수를 출력한다.

코드

s = input()
cnt = 0

for i in range(len(s)-1):
    if s[i]!=s[i+1]:
        cnt+=1
print((cnt+1)//2)

풀이

0001100 을 010으로 생각하고 for문을 돌면서 서로 다른 문자가 나오면 cnt+=1 해준다.

최종에서 cnt//2 만 해주면 될 줄 알았는데 틀렸다고 해서 반례를 찾았다.

 

01010101 이라면 cnt 가 7이 되어서 cnt//2 = 3이 나온다.

하지만 답은 4다.

그래서 cnt+1//2

728x90

문제

언제나 최고만을 지향하는 굴지의 대기업 진영 주식회사가 신규 사원 채용을 실시한다. 인재 선발 시험은 1차 서류심사와 2차 면접시험으로 이루어진다. 최고만을 지향한다는 기업의 이념에 따라 그들은 최고의 인재들만을 사원으로 선발하고 싶어 한다.

그래서 진영 주식회사는, 다른 모든 지원자와 비교했을 때 서류심사 성적과 면접시험 성적 중 적어도 하나가 다른 지원자보다 떨어지지 않는 자만 선발한다는 원칙을 세웠다. 즉, 어떤 지원자 A의 성적이 다른 어떤 지원자 B의 성적에 비해 서류 심사 결과와 면접 성적이 모두 떨어진다면 A는 결코 선발되지 않는다.

이러한 조건을 만족시키면서, 진영 주식회사가 이번 신규 사원 채용에서 선발할 수 있는 신입사원의 최대 인원수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에는 테스트 케이스의 개수 T(1 ≤ T ≤ 20)가 주어진다. 각 테스트 케이스의 첫째 줄에 지원자의 숫자 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개 줄에는 각각의 지원자의 서류심사 성적, 면접 성적의 순위가 공백을 사이에 두고 한 줄에 주어진다. 두 성적 순위는 모두 1위부터 N위까지 동석차 없이 결정된다고 가정한다.

출력

각 테스트 케이스에 대해서 진영 주식회사가 선발할 수 있는 신입사원의 최대 인원수를 한 줄에 하나씩 출력한다.

코드

import sys

T = int(input())
for i in range(T):
    people = []
    n = int(input())
    for j in range(n):
        paper, interview = map(int,sys.stdin.readline().split())
        people.append([paper,interview])
    people.sort()
    good_interview = people[0][1]
    cnt = 1

    for z in range(1,n):
        if people[z][1]<good_interview:
            good_interview = people[z][1]
            cnt+=1

    print(cnt)

풀이

서류심사, 면접심사 중 적어도 하나는 우수해야한다?

서류심사 하나만 우수해도 통과!!

 

-> 서류심사 기준 정렬하고 서류 1등은 무조건 통과.

-> 통과된 서류1등의 면접심사 점수 기준으로 면접심사 점수 비교

처음 면접값 보다 작은값 나오면 cnt+=1 , 반복

 

* 시간오류 문제 *

python으로 시간오류 나와서 import sys 사용해 입력받음..

or

pypy로는 통과

'알고리즘 문제 풀이 > 백준' 카테고리의 다른 글

[백준] 1339 단어 수학 python  (0) 2022.02.10
[백준] 1439 뒤집기 python  (0) 2022.02.10
[백준] 13305 주유소 python  (0) 2022.02.09
[백준] 1789 수들의 합 python  (0) 2022.02.09
[백준] 10610 30 python  (0) 2022.02.09
728x90

문제

어떤 나라에 N개의 도시가 있다. 이 도시들은 일직선 도로 위에 있다. 편의상 일직선을 수평 방향으로 두자. 제일 왼쪽의 도시에서 제일 오른쪽의 도시로 자동차를 이용하여 이동하려고 한다. 인접한 두 도시 사이의 도로들은 서로 길이가 다를 수 있다. 도로 길이의 단위는 km를 사용한다.

처음 출발할 때 자동차에는 기름이 없어서 주유소에서 기름을 넣고 출발하여야 한다. 기름통의 크기는 무제한이어서 얼마든지 많은 기름을 넣을 수 있다. 도로를 이용하여 이동할 때 1km마다 1리터의 기름을 사용한다. 각 도시에는 단 하나의 주유소가 있으며, 도시 마다 주유소의 리터당 가격은 다를 수 있다. 가격의 단위는 원을 사용한다.

예를 들어, 이 나라에 다음 그림처럼 4개의 도시가 있다고 하자. 원 안에 있는 숫자는 그 도시에 있는 주유소의 리터당 가격이다. 도로 위에 있는 숫자는 도로의 길이를 표시한 것이다. 

제일 왼쪽 도시에서 6리터의 기름을 넣고, 더 이상의 주유 없이 제일 오른쪽 도시까지 이동하면 총 비용은 30원이다. 만약 제일 왼쪽 도시에서 2리터의 기름을 넣고(2×5 = 10원) 다음 번 도시까지 이동한 후 3리터의 기름을 넣고(3×2 = 6원) 다음 도시에서 1리터의 기름을 넣어(1×4 = 4원) 제일 오른쪽 도시로 이동하면, 총 비용은 20원이다. 또 다른 방법으로 제일 왼쪽 도시에서 2리터의 기름을 넣고(2×5 = 10원) 다음 번 도시까지 이동한 후 4리터의 기름을 넣고(4×2 = 8원) 제일 오른쪽 도시까지 이동하면, 총 비용은 18원이다.

각 도시에 있는 주유소의 기름 가격과, 각 도시를 연결하는 도로의 길이를 입력으로 받아 제일 왼쪽 도시에서 제일 오른쪽 도시로 이동하는 최소의 비용을 계산하는 프로그램을 작성하시오.

입력

표준 입력으로 다음 정보가 주어진다. 첫 번째 줄에는 도시의 개수를 나타내는 정수 N(2 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 인접한 두 도시를 연결하는 도로의 길이가 제일 왼쪽 도로부터 N-1개의 자연수로 주어진다. 다음 줄에는 주유소의 리터당 가격이 제일 왼쪽 도시부터 순서대로 N개의 자연수로 주어진다. 제일 왼쪽 도시부터 제일 오른쪽 도시까지의 거리는 1이상 1,000,000,000 이하의 자연수이다. 리터당 가격은 1 이상 1,000,000,000 이하의 자연수이다. 

출력

표준 출력으로 제일 왼쪽 도시에서 제일 오른쪽 도시로 가는 최소 비용을 출력한다. 

코드

n = int(input())
road = list(map(int,input().split()))
price = list(map(int,input().split()))

result = 0
now_price = price[0]
for i in range(n-1):
    if price[i]<now_price:
        now_price=price[i]
    result += now_price * road[i]
print(result)

풀이

그리디 알고리즘이다.

왼쪽부터 오른쪽으로 이동하니, 맨 처음 주유소 비용을 최소값으로 두고 이 값보다 작은 값이 나타나면 최소값 변경

road 이동 할 때마다 ( 최소 주유값 * 다리 길이 ) 더해준다.

'알고리즘 문제 풀이 > 백준' 카테고리의 다른 글

[백준] 1439 뒤집기 python  (0) 2022.02.10
[백준] 1946 신입사원 python  (0) 2022.02.10
[백준] 1789 수들의 합 python  (0) 2022.02.09
[백준] 10610 30 python  (0) 2022.02.09
[백준] 2217 로프 python  (0) 2022.02.08
728x90

문제

서로 다른 N개의 자연수의 합이 S라고 한다. S를 알 때, 자연수 N의 최댓값은 얼마일까?

입력

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

출력

첫째 줄에 자연수 N의 최댓값을 출력한다.

코드

s = int(input())
n = 1
while n*(n+1)/2<=s:
    n+=1
print(n-1)

풀이

1부터 n까지의 합 공식 : n*(n+1)/2

최대값을 구해야 하니, 1부터 차례대로 더해줘서 s보다 커질 때 -1 해주면 된다.

 

'알고리즘 문제 풀이 > 백준' 카테고리의 다른 글

[백준] 1439 뒤집기 python  (0) 2022.02.10
[백준] 1946 신입사원 python  (0) 2022.02.10
[백준] 13305 주유소 python  (0) 2022.02.09
[백준] 10610 30 python  (0) 2022.02.09
[백준] 2217 로프 python  (0) 2022.02.08
728x90

문제

어느 날, 미르코는 우연히 길거리에서 양수 N을 보았다. 미르코는 30이란 수를 존경하기 때문에, 그는 길거리에서 찾은 수에 포함된 숫자들을 섞어 30의 배수가 되는 가장 큰 수를 만들고 싶어한다.

미르코를 도와 그가 만들고 싶어하는 수를 계산하는 프로그램을 작성하라.

입력

N을 입력받는다. N는 최대 105개의 숫자로 구성되어 있으며, 0으로 시작하지 않는다.

출력

미르코가 만들고 싶어하는 수가 존재한다면 그 수를 출력하라. 그 수가 존재하지 않는다면, -1을 출력하라.

코드

s = list(input())
s.sort(reverse=True)
sum = 0
for i in s:
    sum+=int(i)
if sum % 3 ==0 and '0' in s:
    print(''.join(s))
else:
    print(-1)

풀이

30의 배수 조건

1. 1의 자리가 0

2. 각 자리 숫자의 합이 3의 배수

 

이 두가지 조건을 만족시키면서 가장 큰 30의 배수를 출력해야하니까 내림차순 정렬해줬다.

'알고리즘 문제 풀이 > 백준' 카테고리의 다른 글

[백준] 1439 뒤집기 python  (0) 2022.02.10
[백준] 1946 신입사원 python  (0) 2022.02.10
[백준] 13305 주유소 python  (0) 2022.02.09
[백준] 1789 수들의 합 python  (0) 2022.02.09
[백준] 2217 로프 python  (0) 2022.02.08
728x90

문제

N(1 ≤ N ≤ 100,000)개의 로프가 있다. 이 로프를 이용하여 이런 저런 물체를 들어올릴 수 있다. 각각의 로프는 그 굵기나 길이가 다르기 때문에 들 수 있는 물체의 중량이 서로 다를 수도 있다.

하지만 여러 개의 로프를 병렬로 연결하면 각각의 로프에 걸리는 중량을 나눌 수 있다. k개의 로프를 사용하여 중량이 w인 물체를 들어올릴 때, 각각의 로프에는 모두 고르게 w/k 만큼의 중량이 걸리게 된다.

각 로프들에 대한 정보가 주어졌을 때, 이 로프들을 이용하여 들어올릴 수 있는 물체의 최대 중량을 구해내는 프로그램을 작성하시오. 모든 로프를 사용해야 할 필요는 없으며, 임의로 몇 개의 로프를 골라서 사용해도 된다.

입력

첫째 줄에 정수 N이 주어진다. 다음 N개의 줄에는 각 로프가 버틸 수 있는 최대 중량이 주어진다. 이 값은 10,000을 넘지 않는 자연수이다.

출력

첫째 줄에 답을 출력한다.

코드

n = int(input())
rope = []
result = []
for i in range(n):
    rope.append(int(input()))
    
rope.sort(reverse=True)
for i in range(n):
    result.append((i+1)*rope[i])
print(max(result))

풀이

그리디 알고리즘이다.

최대 중량을 구해야하므로 내림차순 정렬을 하고, n번째로 큰 중량을 n번 곱하면 된다.

rope[n]*n번째 라는 식으로 중량들을 result에 저장하고

result중 max값을 출력하면 최대 중량을 구할 수 있다.

 

'알고리즘 문제 풀이 > 백준' 카테고리의 다른 글

[백준] 1439 뒤집기 python  (0) 2022.02.10
[백준] 1946 신입사원 python  (0) 2022.02.10
[백준] 13305 주유소 python  (0) 2022.02.09
[백준] 1789 수들의 합 python  (0) 2022.02.09
[백준] 10610 30 python  (0) 2022.02.09

+ Recent posts