Hyunn

SWEA - 18662. 등차수열 만들기 본문

Coding Test

SWEA - 18662. 등차수열 만들기

Ravié 2024. 1. 6. 19:46
728x90
반응형

문제링크: https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=3&contestProbId=AYo-e9EKmGoDFAQI&categoryId=AYo-e9EKmGoDFAQI&categoryType=CODE&problemTitle=&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=3&pageSize=10&pageIndex=1

 

SW Expert Academy

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

swexpertacademy.com

 

GitHub: https://github.com/hyunjin1999/Algorithm_solving/blob/master/SWEA/18662_D3.py

 

세 번째 연습!

등차수열을 만드는 문제이다. 문제를 간단히 설명하자면 1, 2, 3과 같은 수는 등차수열이고 1, 3, 4와 같은 수는 등차수열이 아니다. 등차수열이 아닌 수를 한 번만 조정하여 등차수열을 만들 수 있는 가장 작은 x를 찾는 것이다. 그럼 1, 3, 4에서 x는 1이 될 것이다. 2, 3, 4로 만들면 등차수열이 되니까.

 

먼저, 어떻게 풀어야할지 감이 잡히지 않았다. 10분은 멍하니 문제만 계속 읽었던 것 같다. 그러던 중, 등차수열은 "첫 번째 값 + 세 번째 값 / 2 = 두 번째 값" 이라는 생각이 떠올랐다. 그런데, 이렇게만 하면 항상 두 번째 값을 바꿀 필요는 없잖아? 라는 생각에 차례대로 첫 번째, 두 번째, 세 번째 값을 각각 x로 두고 등차수열을 만들 수 있는 3가지 경우의 수 중 가장 작은 값을 찾아면 되겠다! 라는 생각이 들었다. 즉, 아래와 같다.

이런식으로 생각하고 코드를 작성했다.

결과는... 

아... 제일 난감하다. 차라리 모두 틀렸으면 아예 알고리즘을 갈아 엎었을텐데...

그래서 뭐가 잘못됐지 생각하다가 문제를 다시 읽어보았다. 문제에서 "소수점 첫째자리까지 출력"이라고 했지 반올림 하란 말은 없었다. 그래서 문자열 포매팅을 사용해 소수점 첫째자리까지만 출력하도록 바꿨다.

 

결과는...

풀었죠?

 

import math

T = int(input())
# 여러개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
for test_case in range(1, T + 1):
    li = list(map(int, input().split()))
    first_num = abs(li[0] - (li[1] * 2 - li[2]))
    sec_num = abs(li[1] - ((li[0] + li[2]) / 2))
    third_num = abs(li[2] - (li[1] * 2 - li[0]))
    ans = min(first_num, sec_num, third_num)
    print("#{} {:.1f}".format(test_case, ans))

 

더 좋은 알고리즘이 있다면 알려주세요.

또 주석안달았네...

728x90
반응형