-
9. 두 정수 사이의 합코딩 테스트/Level 1 2019. 10. 7. 23:35반응형
https://programmers.co.kr/learn/courses/30/lessons/12912
파이썬
3항 연산자를 이용했습니다.
가독성이 별로..def solution(a, b): return sum(range(a, b + 1)) if (a < b) else sum(range(b, a + 1))
테스트 1 〉 통과 (0.05ms, 10.7MB) 테스트 2 〉 통과 (0.04ms, 10.7MB) 테스트 3 〉 통과 (0.04ms, 10.8MB) 테스트 4 〉 통과 (307.00ms, 10.6MB) 테스트 5 〉 통과 (209.68ms, 10.7MB) 테스트 6 〉 통과 (164.13ms, 10.7MB) 테스트 7 〉 통과 (89.08ms, 10.7MB) 테스트 8 〉 통과 (140.28ms, 10.7MB) 테스트 9 〉 통과 (110.46ms, 10.7MB) 테스트 10 〉 통과 (22.00ms, 10.8MB) 테스트 11 〉 통과 (0.15ms, 10.7MB) 테스트 12 〉 통과 (0.27ms, 10.6MB) 테스트 13 〉 통과 (0.13ms, 10.7MB) 테스트 14 〉 통과 (0.04ms, 10.8MB) 테스트 15 〉 통과 (0.06ms, 10.8MB) 테스트 16 〉 통과 (0.09ms, 10.7MB)
내장함수 min, max를 이용했습니다.
가독성 개선!def solution(a, b): return sum(range(min(a, b), max(a, b) + 1))
테스트 1 〉 통과 (0.07ms, 10.7MB) 테스트 2 〉 통과 (0.04ms, 10.7MB) 테스트 3 〉 통과 (0.04ms, 10.7MB) 테스트 4 〉 통과 (307.54ms, 10.7MB) 테스트 5 〉 통과 (210.52ms, 10.8MB) 테스트 6 〉 통과 (393.65ms, 10.7MB) 테스트 7 〉 통과 (89.14ms, 10.8MB) 테스트 8 〉 통과 (139.95ms, 10.7MB) 테스트 9 〉 통과 (109.55ms, 10.7MB) 테스트 10 〉 통과 (23.47ms, 10.7MB) 테스트 11 〉 통과 (0.12ms, 10.7MB) 테스트 12 〉 통과 (0.27ms, 10.7MB) 테스트 13 〉 통과 (0.14ms, 10.7MB) 테스트 14 〉 통과 (0.04ms, 10.7MB) 테스트 15 〉 통과 (0.06ms, 10.6MB) 테스트 16 〉 통과 (0.09ms, 10.7MB)
등차수열의 합공식을 이용해 봅시다.
최고죠~!def solution(a, b): return (a + b) * (abs(b - a) + 1) / 2
테스트 1 〉 통과 (0.04ms, 10.7MB) 테스트 2 〉 통과 (0.04ms, 10.6MB) 테스트 3 〉 통과 (0.04ms, 10.7MB) 테스트 4 〉 통과 (0.05ms, 10.8MB) 테스트 5 〉 통과 (0.05ms, 10.7MB) 테스트 6 〉 통과 (0.05ms, 10.7MB) 테스트 7 〉 통과 (0.05ms, 10.7MB) 테스트 8 〉 통과 (0.05ms, 10.6MB) 테스트 9 〉 통과 (0.05ms, 10.6MB) 테스트 10 〉 통과 (0.05ms, 10.7MB) 테스트 11 〉 통과 (0.04ms, 10.7MB) 테스트 12 〉 통과 (0.04ms, 10.7MB) 테스트 13 〉 통과 (0.04ms, 10.7MB) 테스트 14 〉 통과 (0.04ms, 10.7MB) 테스트 15 〉 통과 (0.04ms, 10.7MB) 테스트 16 〉 통과 (0.04ms, 10.7MB)
자바스크립트
function solution(a, b) { return (a+b)*(Math.abs(b-a)+1)/2; }
자바
형의 범위를 먼저 파악해야 합니다.
자바의 int의 범위는 -2,147,483,648 ~ 2,147,483,647입니다.
문제에서 제시한 a와 b는 -10,000,000 이상 10,000,000 이하 정수입니다.
a, b를 더하거나 빼도 모두 int의 범위 안에 있네요.
미리 형 변환을 하면 범위에 대한 걱정을 덜해도 됩니다.
class Solution { public long solution(int a, int b) { long al = a; long bl = b; return (al + bl) * (Math.abs(al - bl) + 1) / 2; } }
하지만 이게 더 깔끔합니다.
class Solution { public long solution(int a, int b) { return (long)(a + b) * (Math.abs(a - b) + 1) / 2; } }
(암시적으로 두는 것보다) 명시적으로 다 붙여주는 것도 좋습니다.
파이썬에는 '명시적인 것이 암시적인 것보다 낫다.'는 철학이 있습니다. 자바에서 파이썬 이야기하는 게 애매합니다만...
class Solution { public long solution(int a, int b) { return (long)(a + b) * (long)(Math.abs(a - b) + 1) / 2; } }
고
고니까 고전적으로 풀어봤습니다.
func solution(a, b int) (sum int64) { if a > b { temp := a a = b b = temp } for i := a; i <= b; i++ { sum += int64(i) } return }
a, b = b, a 와 등차수열 합공식을 이용해 봅시다.
func solution(a, b int) int64 { if a > b { a, b = b, a } return int64((a+b)*(b-a+1)/2) }
코틀린
형의 범위를 확인하지 않고 toLong()으로 도배를 해서 풀었습니다.
블로그에 올리려니 꽤 거슬립니다.
import kotlin.math.abs class Solution { fun solution(a: Int, b: Int) = (a.toLong() + b.toLong()) * (abs(a.toLong() - b.toLong()) + 1) / 2 }
깔끔하네요.
import kotlin.math.abs class Solution { fun solution(a: Int, b: Int) = (a + b).toLong() * (abs(a - b).toLong() + 1) / 2 }
암시적 형변환을 이용한다면 이런 방법도 있습니다.
import kotlin.math.abs class Solution { fun solution(a: Int, b: Int) = (a + b) * (abs(a - b) + 1L) / 2 }
C#
using System; public class Solution { public long solution(int a, int b) => (long)(a + b) * (Math.Abs(b - a) + 1) / 2; }
RUST
fn solution(a: i32, b: i32) -> i64 { let a = a as i64; let b = b as i64; (a + b) * ((b - a).abs() + 1) / 2 } fn main() { println!("{}", solution(10, 1)); }
반응형