반응형

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

 

2869번: 달팽이는 올라가고 싶다

첫째 줄에 세 정수 A, B, V가 공백으로 구분되어서 주어진다. (1 ≤ B < A ≤ V ≤ 1,000,000,000)

www.acmicpc.net

문제

땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다.

달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 후에는 미끄러지지 않는다.

달팽이가 나무 막대를 모두 올라가려면, 며칠이 걸리는지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 세 정수 A, B, V가 공백으로 구분되어서 주어진다. (1 ≤ B < A ≤ V ≤ 1,000,000,000)

출력

첫째 줄에 달팽이가 나무 막대를 모두 올라가는데 며칠이 걸리는지 출력한다.


처음 실패한 코드

A, B, V = map(int, input().split())  # A 올라가는 거리 B 미끄러지는 거리 V 나무 길이
day = 0
distance = 0

while True:
    day += 1
    distance += A
    if distance >= V:
        break
    distance -= B


print(day)

답은 나오지만 시간 초과로 실패한 코드다

A,B,V는 1,000,000,000 라... while이 최대 999,999,999번? 까지 돌 수도 있다... 장수 달팽이

 

계산으로 풀어야 한다.

최종코드

A, B, V = map(int, input().split())  # A 올라가는 거리 B 미끄러지는 거리 V 나무 길이

day = 0

if (V-A) % (A-B) == 0:
    day = (V - A) // (A - B) + 1
else:
    day = (V - A) // (A - B) + 2
print(day)

마지막 날은 미끄러지지 않으니깐 나무 길이에서 하루 올라가는 거리만큼을 뺀다

그리고 올라가는 만큼 나눠준다

+1을 해준건 첫날의 카운트가 0이 아니라 1이어야 하기 때문,

+2를 해준건 나무길이 / 올라가는거리 했을 때 소수점이 나오면 올림을 해줘야하기 때문이다.

반응형
반응형

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5Pw_-KAdcDFAUq 

 

SW Expert Academy

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

swexpertacademy.com


# 1984. 중간 평균값 구하기

T = int(input())

for tc in range(1, T+1):
    num = list(map(int,input().split()))
    min_num = 10000
    max_num = 0

    for i in num:
        if min_num > i:
            min_num = i
        if max_num < i:
            max_num = i
    num.remove(min_num)
    # print(num)
    num.remove(max_num)
    # print(num)

    add = 0


    for i in num:
        add += i
    ans = add/len(num)

    print('#{} {:.0f}'.format(tc,ans))

num에서 최소값과 최대값을 빼기 위해 remove 메서드를 이용했다

처음에 pop을 이용해서 삭제하려고 했는데

remove(값)

pop(인덱스)

라는걸 잊고 pop(값)을 해줘서 계속 인덱스 오류가 발생했다.

만약 pop을 이용하려면 num리스트를 정렬한 후 가장 첫번째 값과 맨 끝값을 pop으로 삭제할 수 있었을 것 같다.

반응형
반응형

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

 

SW Expert Academy

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

swexpertacademy.com


# 1983. 조교의 성적 매기기
grade = ['A+', 'A0', 'A-', 'B+', 'B0', 'B-', 'C+', 'C0', 'C-', 'D0']
T = int(input())
for tc in range(1, T+1):
    N, K = map(int,input().split())
    score_list = []
    sort_list = []
    for i in range(N):
        m_test, f_test, hw = map(int, input().split())
        score = (0.35*m_test + 0.45*f_test + 0.2*hw)
        score_list.append(score)
        sort_list.append(score)


    # score_list 정렬
    for i in range(N):
        for j in range(i,N):
            if sort_list[i] < sort_list[j]:
                sort_list[i],sort_list[j] = sort_list[j], sort_list[i]

    for i in range(N):
        if sort_list[i] == score_list[K-1]:
            grade_idx = i//(N//10)

            print('#{} {}'.format(tc, grade[grade_idx]))

알고리즘을 처음 접할 무렵 어떻게 해서도 풀 수 없었던 문제를 지금 풀게 되어 너무 기쁘다

이 문제도 풀면서 문제가 많았는데

나는 score_list와 sort_list로 받아온 점수와 그것을 정렬한 점수 리스트를 나누어서 K가 몇등인지 알아내려고 했다

어차피 sort_list를 받기 위해서는 score_list를 받아오고 그걸 정렬해야해서

sort_list = score_list

이렇게 처음 sort_list를 받아온 후 정렬을 했는데 이런식으로 정렬을 진행하면 sort_list를 정렬 한 후

score_list도 sort_list와 같이 정렬이 되어버린다는 문제가 생긴다

 

리스트 호출에 대한 개념이 부족해서 생긴 실수다. 이론 공부를 해야겠다

반응형
반응형

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

 

SW Expert Academy

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

swexpertacademy.com


카운팅 알고리즘을 이용해서 풀이

2021.08.23 - [분류 전체보기] - [알고리즘] 카운팅정렬 이해하기


# [s/w 문제해결 기본] 1일차 - 최빈수 구하기

T = int(input())

for tc in range(1, T+1):
    test_case = int(input())
    score_list = list(map(int,input().split()))
    max_num = 0
    max_idx = 0

    counts = [0] * 101

    for i in range(1000):
        counts[score_list[i]] += 1
    # print(counts)

    for i in range(101):
        if counts[i] >= max_num:
            max_num = counts[i]
            max_idx = i
    print('#{} {}'.format(tc, max_idx))

처음에 큰 수의 index를 받기 위해 

    for i in range(101):
        if counts[i] >= max_num:
            max_num = counts[i]
            max_idx = score_list.index(max_num)
    print('#{} {}'.format(tc, max_idx))

이 방법을 이용해서 풀었는데 이렇게되면 max_num은 큰 인덱스 값을 가리칠지언정 max_idx가 가져오는 값은 결국 'max_num과 같은 값을 가지고 있는 가장 작은 값'이 나오기 때문에 문제에서 주어지는

단, 최빈수가 여러 개 일 때에는 가장 큰 점수를 출력하라

조건을 지킬 수 없다

 

index값을 어떻게 받아올 수 있을지 리스트를 뒤에서부터 정렬도 해보고 별짓을 다 했는데

결론은 그냥 i 값을 받아오면 되는거였다.

반응형
반응형

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의 소수문제가 점점 풀기 어려워져서

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

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

반응형

+ Recent posts