삼항연산자를 사용해서 더 깔끔하게 코딩해봤다. print('Junhee is '+'not '*(m>0)+'cute!') 누가 이렇게 해놨던데 개쩐다고 생각했다 ㅋㅋㅋㅋ숏코딩오짐 N = int(input()) cute = not_cute = 0 for i in range(N): if int(input()) == 1: cute += 1 else: not_cute += 1 print("Junhee is cute!" if cute > not_cute else "Junhee is not cute!") eval 쓴 예도 봤는데 뭔지 잘몰라서 그냥 넘어감 😔(www.acmicpc.net/source/13442756)
10^1000까지 계산해서 int로 계산하면 오버플로우가 날까봐 걱정했는데, int 타입 변수의 값이 표현 범위를 넘어서게 되면 자동으로 long으로 타입 변경이 되는 형식이라서 걱정 안해도 된다고 한다. long은 수가 커지면 자동으로 공간을 더 할당한다. ahracho.github.io/posts/python/2017-05-09-python-integer-overflow/ 참조 근데 2^31-1을 표현하기 위해서 c에서는 4바이트를 사용했는데 파이썬에서는 무려 28바이트를 사용한다고 한다.... 그래서 PS할 때 안좋다고 얘기하던거구나............. 🤔 아무튼 코드 n, m = map(int, input().split()) print(n//m) print(n % m)
a = b = c = sys.maxsize 깔끔하다 ☺️
한수 = [111, 123, 135, 147, 159, 210, 222, 234, 246, 258, 321, 333, 345, 357, 369, 420, 432, 444, 456, 468, 531, 543, 555, 567, 579, 630, 642, 654, 666, 678, 741, 753, 765, 777, 789, 840, 852, 864, 876, 888, 951, 963, 975, 987, 999] N = int(input()) if N N: print(99 + i) break 1~1000이길..
N = int(input()) data = [] for _ in range(N): data.append(list(map(int, input().split()))) for i in range(N): x1 = data[i][0] y1 = data[i][1] r1 = data[i][2] x2 = data[i][3] y2 = data[i][4] r2 = data[i][5] distance = (x2-x1)**2 + (y2-y1)**2 if x1 == x2 and y1 == y2: # 두 점이 같을 때 예외 처리 # if r1 == 0 and r2 == 0: # # 그 점밖에 안됨 # result.append(1) if r1 == r2: # 무한대의 점 가능 print(-1) else: # 불가능 print(0)..
class Color(object): def __init__(self, name, value, multiply): self.name = name self.value = value self.multiply = multiply colors = [Color("black", 0, 1), Color("brown", 1, 10), Color("red", 2, 100), Color("orange", 3, 1000), Color("yellow", 4, 10000), Color("green", 5, 100000), Color("blue", 6, 1000000), Color("violet", 7, 10000000), Color("grey", 8, 100000000), Color("white", 9, 1000000000)]..
N = int(input()) prices = [0] + list(map(int, input().split())) max_prices = [0 for _ in range(N+1)] for i in range(1, N+1): # 한 줄 씩 index = (i+1) // 2 maxForI = prices[i] for j in range(index, i): if (max_prices[j] + max_prices[i-j]) > maxForI: maxForI = (max_prices[j] + max_prices[i-j]) max_prices[i] = maxForI print(max_prices[N])
내가 짜는 방식보다 남이 짠 방식이 더 좋아서 갖고왔다 출처 : claude-u.tistory.com/208 N, K = map(int, input().split()) stuff = [[0, 0]] knapsack = [[0 for _ in range(K + 1)] for _ in range(N + 1)] for _ in range(N): stuff.append(list(map(int, input().split()))) for i in range(1, N + 1): for j in range(1, K + 1): weight = stuff[i][0] value = stuff[i][1] if j < weight: knapsack[i][j] = knapsack[i - 1][j] else: knapsack[i]..
import sys lineNum = int(sys.stdin.readline()) for i in range(lineNum): blanks = lineNum-i-1 stars = i * 2 + 1 if i == lineNum-1: for many in range(stars): print("*", end="") break for j in range(blanks): print(" ", end="") for m in range(stars): if m == 0 or m == stars-1: print("*", end="") else: print(" ", end="") print("")
import sys num = int(sys.stdin.readline()) # 위쪽 반 for i in range(num): stars = num-i-1 blanks = i for j in range(blanks): print(" ", end="") for m in range(stars*2+1): print("*", end="") print("") # 아래쪽 반 for i in range(num-1): stars = i+1 blanks = num-i-2 for j in range(blanks): print(" ", end="") for k in range(stars*2+1): print("*", end="") print("")
import sys num = int(sys.stdin.readline()) # 위쪽 반 for i in range(num): stars = i+1 blanks = num-i-1 for j in range(blanks): print(" ", end="") for m in range(stars): print("*", end="") print("") # 아래쪽 반 for i in range(num-1): stars = num-i-1 blanks = num-stars for j in range(blanks): print(" ", end="") for k in range(stars): print("*", end="") print("")
import sys num = int(sys.stdin.readline()) # 위쪽 반 for i in range(num): stars = i+1 blanks = num-i-1 for k in range(stars): print("*", end="") for j in range(blanks*2): print(" ", end="") for m in range(stars): print("*", end="") print("") # 아래쪽 반 for i in range(num-1): stars = num-i-1 blanks = num-stars for k in range(stars): print("*", end="") for j in range(blanks*2): print(" ", end="") for k ..
www.acmicpc.net/problem/1629 푸는데 오래걸린 문제다 일단 이 문제의 핵심 포인트는 '시간제한' 이다. 사실 파이썬은 숫자가 long long 이상이어도 자동으로 더 많이 공간을 할당해서 수가 아무리 커지더라도 상관은 없다. 그치만 계산 시간때문에 overflow가 나지 않더라도 시간초과가 뜰 것이다. 그래서 일반적인 방식으로 A^B를 계산할 수는 없는 것이다. 궁금해서 2147483647^2147483647 % 2147483647 을 넣어봤는데 10초가 지나도 답이 안뜨길래 아..이방식으로는 안되는구나 했다. (이 문제의 시간 제한은 언어 관련 없이 0.5초이다.) ko.khanacademy.org/computing/computer-science/cryptography/modari..
Branch & bound는 한국말로 하면 '분기 한정'이라고 할 수 있는데, 분기를 한정시켜서 쓸데 없는 낭비를 줄이는 방법이다. backtracking보다 나은 방법이라고 하는데, 왜냐면 backtracking은 가보고 진행이 안되면 돌아오는데 branch and bound는 최적해를 찾을 가능성 자체가 없으면 가 보지도 않는 느낌이랄까??? 이게 어떻게 가능한지 한번 살펴보자. 일단 0/1 knapsack problem이 뭔지는 옛날 게시글에서 설명했으니까 패스한다. 이글을 참조하세요 https://sweetdev.tistory.com/528 이런 물건 4개가 있었고, 내 가방의 weight의 한계는 15였다고 해보자. 내가 branch and bound에서 되게 특이하다고 생각했던 점은, 얘는 p..
해밀토니안...! 해밀토니안 자체는 사람 이름이 아니고, '해밀턴'씨가 만들어서 해밀토니안인데 이 아저씨도 약간 다작해서 짜증나는 사람이다. 물리학도 수학도 컴퓨터공학도를 동시에 고통주는 이 능력... 아무튼 해밀토니안 사이클은 다음과 같은 문제이다. 모든 정점을 한번씩 방문하고 첫 지점으로 돌아와야 한다! 그런 길이 존재할까??? (directed graph도 되고 undirected graph도 됨) 다음과 같이 (못그린) 그래프가 있다고 해 보자. 1부터 시작해서 모든 정점을 다 방문하고 다시 1로 돌아오는 path가 있을까?? 이를 위해서 다음과 같은 표를 하나 그렸다. 일단 첫 시작점은 1이니까 1을 써준다. 다음으로 앞에 나오지 않고, 바로 앞 칸과 이어져 있는 정점을 써준다. 이렇게! 마지막..
n-queens problem은 크기가 N인 체스판에, 여왕말 N개를 서로를 공격할 수 없게 두는 것이다. 이건 꽤 흥미로운데, 왜냐면 queen은 좌우상하 대각선4방향 전부 다 되기 때문...!!! 그래서 생각보다 놓을 수 있는 곳이 한정적이다. 이걸 풀기 위해서 backtracking이라는 기법을 적용했다. 백트래킹(backtracking)이란? : 해를 찾는 도중 해가 아니어서 막히면, 되돌아가서 다시 해를 찾아가는 기법을 말합니다. 최적화 문제와 결정 문제를 푸는 방법이 됩니다. 출처: https://chanhuiseok.github.io/posts/algo-23/ 일단 어떻게 거기 놓을 수 있는지 판단하는 방법부터 알아보자. 다음과 같이 (1,2)에 놓인 queen이 있다. (왼쪽 위는 0,0이..
subset은 한국말로 '부분집합'이라는 뜻이고, subset sum problem은 따라서 부분집합 더하기 문제?라고 생각할 수 있다!! subset sum problem이 어떤거냐면, total = 11이고 {2, 3, 7, 8, 10}인 집합이 있으면, 집합의 원소들을 더해서 total값을 만들 수 있는지 확인하는 문제이다. 세로줄에는 각각 원소들, 가로줄에는 0부터 total까지가 배치되어 있다고 해 보자. 2, 3, 7, 8, 10을 0개씩 쓰면 합이 0이 될 수 있으므로 첫 줄을 다 T로 채워준다. 1은 2의 합으로 될 수 없으므로 F. 2는 2의 합으로 될 수 있으므로 T. 3 이상의 값은 2로 만들어질 수 없으므로 전부다 F. 3보다 작은 값은 !!!윗줄을 그대로 채워준다 3은 T 이제 4..
알고리즘 문제중에 굉장히? 그나마 흥미로운 문제라고 생각했던 knapsack problem!!!! knapsack은 작은 배낭이라는 뜻이다...귀엽네... 가방에 어떤어떤 물건을 넣을수 있을까? 를 물어보는 알고리즘 문제다. 미국놈들은 이렇게 문제 이름은 귀엽게 짓고, 문제는 ㅈㄴ 어렵게 내는 습관이 있는 것 같다. 아무튼 가방에 어떤 물건을 넣을 수 있을지 dynamic problem으로 풀어보자 ^^ 나에게는 이런 4개의 물건이 있다. 각각은 weight과 value를 가지고 있다. 그리고 나에게는 한개의 가방이 있는데, 이 가방에는 최대 7만큼의 weight만 들어갈 수 있다. 내가 넣은 물건들의 value의 합이 최대가 되게 하려면, 어떤 어떤 물건들을 넣어야 할까??? 이를 Dynamic pro..
1. Top-Down 방식: O(2^2/n) a.k.a : Recursive한 방식. T(n): fib(n)을 계산하기 위해서 fibonacci함수를 호출하는 횟수 T(0) = 1 T(1) = 1 T(n) = T(n-1) + T(n-2) + 1 (for n >=2) T(n-1) > T(n-2)임은 명백하고, T(n-1) + T(n-2) > 2 * T(n-2) 임도 명백하다. T(n) > ( 2 ^ 1 )T(n-2)이고, T(n) > ( 2 ^ 2 )T(n-4), T(n) > ( 2 ^ 3 )T(n-6), ... T(n) > 2*(n/2)T(0) 일 것이다. 따라서 계산은 2^n/2번 이루어진다. 2. Bottom-Up 방식 1 1 2 3 5 8 13 이런식으로 n(linear)하다. 그러므로 O(n)
var a: Int = Int(readLine()!)! var b: Int = Int(readLine()!)! var c: Int = Int(readLine()!)! let result = a * b * c var count: [Int] = Array.init(repeating: 0, count: 10) let resultAsString = String(result) resultAsString.forEach{ i in let j = Int(String(i)) for k in 0...9{ if j == k{ count[k] += 1 } } } count.forEach{ print($0) }