반응형

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV189xUaI8UCFAZN 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com


A수도요금과 B수도요금을 계산하고 둘을 비교 하는 문제


# 수도 요금 경쟁

T = int(input())

for tc in range(1, T+1):
    p, q, r, s, w = map(int, input().split())

    Asudo = p*w

    Bsudo = 0

    if w < r:
        Bsudo = q
    else:
        Bsudo = q + (w-r)*s

    if Asudo < Bsudo:
        print('#{} {}'.format(tc, Asudo))
    else:
        print('#{} {}'.format(tc, Bsudo))

A 수도요금은 쓴만큼 가격이 오르기 때문에 요금(p)*내가 쓴 양(w)

으로 간단히 계산하고

B 수도요금은 내가 사용한 양이 기본 값을 넘는 경우와 넘지 않는 경우로 나눠서 계산해주었다!

반응형
반응형

https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=2&contestProbId=AV5PxmBqAe8DFAUq&categoryId=AV5PxmBqAe8DFAUq&categoryType=CODE&problemTitle=&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=2&pageSize=10&pageIndex=1 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

지그재그 숫자


if 문으로 홀수와 짝수를 판별할 수 있다면 아주 쉽게 풀 수 있는 문제


T = int(input())

for tc in range(1, T+1):
    num = int(input())
    
    ans = 0
    
    for i in range(1, num+1):
        if i%2:				# 홀수라면
            ans = ans + i
        else:				# 짝수라면
            ans = ans - i
    print('#{} {}'.format(tc, ans))

 

반응형
반응형

https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=2&contestProbId=AV5P1kNKAl8DFAUq&categoryId=AV5P1kNKAl8DFAUq&categoryType=CODE&problemTitle=&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=2&pageSize=10&pageIndex=1 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

패턴 마디의 길이

 


접근 방법

- for 문으로 숫자를 하나씩 증가시키며 슬라이싱으로 text를 읽는다

- 읽어준 text를 패턴 리스트에 입력한 후 다음 패턴과 비교해준다

- 패턴이 반복되기 시작하면 해당 패턴의 길이를 출력해준다


T = int(input())

for tc in range(1, T+1):
    
    text = input()
    patten =[]
    next_patten=[]
    ans = 0
    for i in range(11):					# 마디의 최대 길이가 10이므로 range(11)
        patten = text[:i]				# patten리스트에 패턴 입력
        next_patten = text[i:i*2]		# 다음 패턴 입력
        #print(patten)
        #print(next_patten)
        if i!=0 and patten == next_patten :	# 다음 패턴과 이번 패턴이 같은경우
            ans = len(patten)			# 길이 출력
            break
    print('#{} {}'.format(tc, ans))

 

반응형
반응형

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

 

4153번: 직각삼각형

입력은 여러개의 테스트케이스로 주어지며 마지막줄에는 0 0 0이 입력된다. 각 테스트케이스는 모두 30,000보다 작은 양의 정수로 주어지며, 각 입력은 변의 길이를 의미한다.

www.acmicpc.net

문제

과거 이집트인들은 각 변들의 길이가 3, 4, 5인 삼각형이 직각 삼각형인것을 알아냈다. 주어진 세변의 길이로 삼각형이 직각인지 아닌지 구분하시오.

입력

입력은 여러개의 테스트케이스로 주어지며 마지막줄에는 0 0 0이 입력된다. 각 테스트케이스는 모두 30,000보다 작은 양의 정수로 주어지며, 각 입력은 변의 길이를 의미한다.

출력

각 입력에 대해 직각 삼각형이 맞다면 "right", 아니라면 "wrong"을 출력한다.


# 직각삼각형

while True:
    num = list(map(int,input().split()))
    if sum(num) == 0:
        break
    max_num = max(num)

    add = 0

    for i in range(3):
        if num[i] != max_num:
            add += num[i]*num[i]


    if max_num*max_num == add:
        print('right')
    else:
        print('wrong')

피타고라스의 정의를 사용해서 문제를 풀어야한다!

가장 큰 숫자를 미리 변수에 넣어두고 나머지 두 숫자를 제곱해서 더한 후

숫자가 같으면 right 다르면 wrong을 출력하도록 하였다.

반응형
반응형

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

 

3009번: 네 번째 점

세 점이 주어졌을 때, 축에 평행한 직사각형을 만들기 위해서 필요한 네 번째 점을 찾는 프로그램을 작성하시오.

www.acmicpc.net

문제

세 점이 주어졌을 때, 축에 평행한 직사각형을 만들기 위해서 필요한 네 번째 점을 찾는 프로그램을 작성하시오.

입력

세 점의 좌표가 한 줄에 하나씩 주어진다. 좌표는 1보다 크거나 같고, 1000보다 작거나 같은 정수이다.

출력

직사각형의 네 번째 점의 좌표를 출력한다.


# 네 번째 점

dotx_1, doty_1 = map(int,input().split())
dotx_2, doty_2 = map(int,input().split())
dotx_3, doty_3 = map(int,input().split())

x = [dotx_1, dotx_2, dotx_3]
y = [doty_1, doty_2, doty_3]

for i in range(3):
    if x.count(x[i]) == 1:
        print(x[i], end =' ')
for i in range(3):
    if y.count(y[i]) == 1:
        print(y[i])

처음에는 빈 리스트를 만들고 첫번째 점을 넣은 후 같은 값이 들어오면 해당값을 빼고 다른 값이 들어오면 해당값을 리스트에 더한 후 최후에 남은 값을 출력하도록 짜려고 했는데

그냥 리스트에 다 넣고 개수가 하나인 것을 출력하는게 훨씬 쉽다는걸 너무 늦게 알았다.

반응형
반응형

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

 

1085번: 직사각형에서 탈출

한수는 지금 (x, y)에 있다. 직사각형은 각 변이 좌표축에 평행하고, 왼쪽 아래 꼭짓점은 (0, 0), 오른쪽 위 꼭짓점은 (w, h)에 있다. 직사각형의 경계선까지 가는 거리의 최솟값을 구하는 프로그램

www.acmicpc.net

문제

한수는 지금 (x, y)에 있다. 직사각형은 각 변이 좌표축에 평행하고, 왼쪽 아래 꼭짓점은 (0, 0), 오른쪽 위 꼭짓점은 (w, h)에 있다. 직사각형의 경계선까지 가는 거리의 최솟값을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 x, y, w, h가 주어진다.

출력

첫째 줄에 문제의 정답을 출력한다.


# 직사각형에서 탈출

x, y, w, h = map(int, input().split())

min =1000

if x < min:
    min = x
if y < min:
    min = y
if w - x < min:
    min = w-x
if h - y < min:
    min = h-y

print(min)

대각선 길이를 고려해 줄 필요가 없으므로 -만으로 단순하게 표현할 수 있었다

첫 min값이 1000인 이유는 제한사항이 1<= w, h <= 1,000이라서!

 

기본 수학2의 소수문제가 점점 풀기 어려워져서

일단 소수로부터 탈출했다.

내가 풀기에 어렵지 않은 알고리즘을 풀면 스트레스가 풀리는 기분이다.

반응형
반응형

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

 

11653번: 소인수분해

첫째 줄에 정수 N (1 ≤ N ≤ 10,000,000)이 주어진다.

www.acmicpc.net

문제

정수 N이 주어졌을 때, 소인수분해하는 프로그램을 작성하시오.

입력

첫째 줄에 정수 N (1 ≤ N ≤ 10,000,000)이 주어진다.

출력

N의 소인수분해 결과를 한 줄에 하나씩 오름차순으로 출력한다. N이 1인 경우 아무것도 출력하지 않는다.


# 소인수분해

N = int(input())
num = N
factorizaton = []
i = 2
while num > 1:
    if num % i == 0:
        num = num//i
        factorizaton.append(i)
        continue
    i += 1

for i in factorizaton:
    print(i)

N으로 입력값을 받고 num에 N값을 넣어 num 값을 나눠가며 계산했다

지금 생각해보면 그냥 N을 이용했어도 됐을 것 같다

num이 2부터 돌면서 나머지가 0이 되면(나눠지면) factorization리스트에 값을 추가해주고

최종적으로 factorization을 하나씩 출력해줬다

반응형
반응형

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

 

2581번: 소수

M이상 N이하의 자연수 중 소수인 것을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다.  단, M이상 N이하의 자연수 중 소수가 없을 경우는 첫째 줄에 -1을 출력한다.

www.acmicpc.net

문제

자연수 M과 N이 주어질 때 M이상 N이하의 자연수 중 소수인 것을 모두 골라 이들 소수의 합과 최솟값을 찾는 프로그램을 작성하시오.

예를 들어 M=60, N=100인 경우 60이상 100이하의 자연수 중 소수는 61, 67, 71, 73, 79, 83, 89, 97 총 8개가 있으므로, 이들 소수의 합은 620이고, 최솟값은 61이 된다.

입력

입력의 첫째 줄에 M이, 둘째 줄에 N이 주어진다.

M과 N은 10,000이하의 자연수이며, M은 N보다 작거나 같다.

출력

M이상 N이하의 자연수 중 소수인 것을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다.

단, M이상 N이하의 자연수 중 소수가 없을 경우는 첫째 줄에 -1을 출력한다.


M = int(input())
N = int(input())

add = 0
min = 10000
cnt = 0

for sosu in range(M, N+1):
    sosu_check = 0
    for i in range(1,sosu+1):
        if sosu % i == 0:
            sosu_check += 1
    if sosu_check == 2:
        add += sosu
        cnt += 1
        if sosu < min:
            min = sosu
if cnt > 0:
    print(add)
    print(min)
else:
    print(-1)

2021.09.15 - [study/백준] - [백준] 1978번 소수 찾기 : python

 

[백준] 1978번 소수 찾기 : python

https://www.acmicpc.net/problem/1978 1978번: 소수 찾기 첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다. www.acmicpc.net 문제 주어진 수 N..

w-world.tistory.com

이전 소수 찾기와 같은 방법으로 소수를 찾아내고

if 문을 사용해서 add min을 찾아내는 코드를 작성하였다.

예제 입력시 답은 나오는데 시간초과로 틀렸다.

 

최종코드

M = int(input())
N = int(input())

add = 0
min = 10000
cnt = 0

for sosu in range(M, N+1):
    sosu_check = 0
    if sosu != 1:
        for i in range(2,sosu):
            if sosu % i == 0:
                sosu_check = -1
                break
        if sosu_check == 0:
            add += sosu
            cnt += 1
            if sosu < min:
                min = sosu
if cnt > 0:
    print(add)
    print(min)
else:
    print(-1)

그래서 한번이라도 나머지가 0이 나오면 소수가 아니기 때문에

sosu % i == 0 이 나오면 break되도록 바꿔 주었다.

M 이 1이 들어올 수도 있으니깐 if sosu != 1 해줘야한다. 안그러면 틀린다.

 

아직 엄청 많은 문제를 풀어본건 아니지만 백준이 swea와 비교했을때 저런 하나의 예외를 잡아야 통과되는 문제가 많은 것 같다. 백준 어렵다

반응형
반응형

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

 

1978번: 소수 찾기

첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다.

www.acmicpc.net

문제

주어진 수 N개 중에서 소수가 몇 개인지 찾아서 출력하는 프로그램을 작성하시오.

입력

첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다.

출력

주어진 수들 중 소수의 개수를 출력한다.


# 소수 찾기

N = int(input())
num = list(map(int,input().split()))

sosu = 0
for i in num:
    cnt = 0
    for j in range(1,i+1):
        if i % j == 0:
            cnt += 1
    if cnt == 2:
        sosu += 1

print(sosu)

소수의 개념이 1과 자기자신으로 밖에 나눌 수 없는 수라 j 로 1에서 자기자신까지 돌려서 나머지가 0인 수를 찾아줬다

그리고 나머지가 0인 경우가 2번이면 소수이므로 변수 sosu의 카운트 증가

sosu출력

반응형
반응형

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

 

1712번: 손익분기점

월드전자는 노트북을 제조하고 판매하는 회사이다. 노트북 판매 대수에 상관없이 매년 임대료, 재산세, 보험료, 급여 등 A만원의 고정 비용이 들며, 한 대의 노트북을 생산하는 데에는 재료비와

www.acmicpc.net

문제

월드전자는 노트북을 제조하고 판매하는 회사이다. 노트북 판매 대수에 상관없이 매년 임대료, 재산세, 보험료, 급여 등 A만원의 고정 비용이 들며, 한 대의 노트북을 생산하는 데에는 재료비와 인건비 등 총 B만원의 가변 비용이 든다고 한다.

예를 들어 A=1,000, B=70이라고 하자. 이 경우 노트북을 한 대 생산하는 데는 총 1,070만원이 들며, 열 대 생산하는 데는 총 1,700만원이 든다.

노트북 가격이 C만원으로 책정되었다고 한다. 일반적으로 생산 대수를 늘려 가다 보면 어느 순간 총 수입(판매비용)이 총 비용(=고정비용+가변비용)보다 많아지게 된다. 최초로 총 수입이 총 비용보다 많아져 이익이 발생하는 지점을 손익분기점(BREAK-EVEN POINT)이라고 한다.

A, B, C가 주어졌을 때, 손익분기점을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 A, B, C가 빈 칸을 사이에 두고 순서대로 주어진다. A, B, C는 21억 이하의 자연수이다.

출력

첫 번째 줄에 손익분기점 즉 최초로 이익이 발생하는 판매량을 출력한다. 손익분기점이 존재하지 않으면 -1을 출력한다.


a, b, c = map(int, input().split())
ans = 1

flag = 1

while True:
    if b > c:
        flag = 0
        break
    if a+(b*ans) < c*ans:
        break
    ans += 1
if flag == 0:
    print(-1)

if flag == 1:
    print(ans)

while문을 사용해 ans의 값을 1에서부터 하나씩 늘려가면서 손익분기점이 맞는지 아닌지 확인하는 코드를 짰다.

flag는 손익분기점이 존재하는지 확인하는 변수로, 하나를 만드는데 드는 비용이 판매비용보다 비쌀 경우 손익분기점이 존재할 수 없으므로 b > c 일때 flag가 0으로 바뀌도록 하였다.

코드는 잘 돌아가나, 예제 3번이 시간초과로 해결이 안된다. 지금도 파이참에서 돌려놓고 이 글을 다 쓰는 지금까지 답이 안나왔다. 시간초과를 해결해야 했다.

f a < (c-b)*ans:
        break
    ans += 1

이렇게 바꾸면 *ans를 한번밖에 안하니깐 시간이 좀 줄어들지 않을까? 싶었지만 도찐개찐이었다.

 

a, b, c = map(int, input().split())

if b > c:
    print(-1)

else : print((a//(c-b))+1)

그러다 이렇게 계산할 수 있다는걸 찾아냈는데....!

ZeroDivisionError가 발생했다 아무래도 테스트케이스 중 b와 c 가 같은 경우가 있는가보다

최종코드

a, b, c = map(int, input().split())

if b >= c:
    print(-1)

else : print((a//(c-b))+1)

b = c 라는건 결국 손익분기점에 도달할 수 없다는거니깐 >=로 부등호를 변경해줬다

잘 작동!

반응형

+ Recent posts