A. Changing Volume

문제

https://drive.google.com/open?id=15YW2G2KMWpkqUJCCuA8X3PMB1jC1HIur

a -> b로 숫자를 바꿔야 하는데, -5, -2, -1, 1, 2, 5만 사용해야된다. 단 숫자가 0이하로는 떨어지지 않기 때문에 0에서 -5를 계속 해줘도 음수가 되지는 않는다. 최소한으로 저 숫자들을 사용해서 a -> b로 만들었을때, 몇번 걸리는가?

예시

[input]
3
4 0
5 14
3 9

[output]
2
3
2

답1 – 이곳을 클릭하면 정답이 보입니다
def answer(a, b) :
  count = 0
  c = abs(a - b)
  if c == 0 : return count
  buttons = [5, 2, 1]
  for btn in buttons :
    count += c//btn
    c = c%btn
  return count


testCount = int(input())
for _ in range(testCount) :
  a, b = map(int, input().split())
  print(answer(a, b))

설명

답2 – 이곳을 클릭하면 정답이 보입니다
for _ in range(int(input())):
    a,b=map(int,input().split())
    diff=abs(a-b)
    print (diff//5 + (diff%5)//2 + ((diff%5)%2))

ㅋㅋ 더 심플하네

B. Fridge Lockers

문제

https://drive.google.com/open?id=1tzcloHAisJxKjyJQi8c-ChdnjeBZjsyX

1번 사람이 1번 냉장고에 걸려있는 사슬을 풀어버려도 다른 냉장고를 열수있는건 아니다.

하지만

3번 냉장고의 주인이 자신의 냉장고를 열기 위해서 c, d쇠사슬 두개를 제거해 버리면,, 4번 냉장고도 열 수 있게된다. 이렇게 되면 개인 재산권 침해. private하지 못하다.

각각의 냉장고는 무게가 있다. 1개의 쇠사슬을 설치하는 비용은 2개의 냉장고의 무게이다(쇠사슬이 그 두개의 냉장고를 연결하고 있기 때문).

그래서, 나에게 n(냉장고의 숫자), m(쇠사슬 개수), a(각 냉장고의 무게가 적혀있는 배열) 가 주어지는데, 이 정보를 가지고 모든 냉장고가 private하도록 했을때의 최소 비용을 구하는거다. 만약에 도저히 만들 수 없으면 -1을 돌려주면된다.

예시

[input]
3
4 4
1 1 1 1
3 1
1 2 3
3 3
1 2 3

[output]
8
1 2
4 3
3 2
4 1
-1
12
3 2
1 2
3 1

답1 – 여기를 클릭하면 정답이 보입니다
def answer(people, steelCount, weights) :
  if steelCount < people or people == 2 :
    return print(-1)

  totalFee = (sum(weights) * 2)
  nodeRelations = []
  for node in range(1, len(weights)) :
    nodeRelations.append([node, node+1])
  nodeRelations.append([len(weights), 1])
  
  print(totalFee)
  for nr in nodeRelations :
    print(str(nr[0]) + " " + str(nr[1]))

testCount = int(input())
for _ in range(testCount) :
  n, m = map(int, input().split())
  weights = list(map(int, input().split()))
  answer(n, m, weights)
답2 – 여기를 클릭하면 정답이 보입니다

설명

C. League of Leesins

문제

https://drive.google.com/open?id=1P0FYVAHFlu1viKs5nF7NCXPQpjjnnMec

결론은 막 섞어논 배열에서 나름 합당한 순서를 찾아서 출력하는거다.

예시

[input]
5
4 3 2
2 3 5
4 1 2

[output]
1 4 2 3 5

답1 – 여기를 클릭하면 정답이 보입니다
import collections

def findHeadIndex(q, qList) :
  dic = collections.Counter(qList)
  head = 0
  headIndex = -1
  for k, v in dic.items() :
    if v == 1 :
      head = k
      break
  for i in range(len(q)) :
    if head in q[i] :
      headIndex = i
  return (headIndex, head)

def pAppend(p, q) :
  for i in range(len(q)) :
    lastTwo = set(p[-2:])
    sq = set(q[i])
    if len(lastTwo & sq) == 2 :
      diffEl = next(iter(sq-lastTwo))
      p.append(diffEl)
      q.pop(i)
      return pAppend(p, q)
  return p

def answer(n, q, qList) :
  headIndex, head = findHeadIndex(q, qList)
  searchedIndexes = []
  headLine = q.pop(headIndex)
  headLine.remove(head)
  tempQ = q[:]
  # try 1
  p = [head, headLine[0], headLine[1]]
  i = 0
  p = pAppend(p, q)
  if len(p) != n :
    p = [head, headLine[1], headLine[0]]
    p = pAppend(p, tempQ)
  
  return " ".join([str(c) for c in p])

n = int(input())
col = n-2
q = []
qList = []
for _ in range(col) :
  li = list(map(int, input().split()))
  q.append(li)
  qList += li
print(answer(n, q, qList))

근데 너~~무 오래걸린다

답2 – 여기를 클릭하면 정답이 보입니다
def answer(n, q) :
  p = []
  dic = {}
  for i in range(1, n+1) :
    dic[i] = []
  for li in q :
    dic[li[0]].append(li)
    dic[li[1]].append(li)
    dic[li[2]].append(li)

  one = []
  two = []
  for i in range(1, n+1) :
    if len(dic[i]) == 1 :
      one.append(i)
    elif len(dic[i]) == 2 :
      two.append(i)
  a = one[0]
  b = 0
  c = 0
  for i in two :
    for li in dic[i] :
      if a in li :
        b = i
        c = sum(li) - (a+b)
        break
  p = p + [a, b, c]
  
  for _ in range(n-3) :
    for li in dic[b] :
      if ((a in li) is False) and ((b in li) and (c in li)) :
        a = b
        b = c
        c = sum(li) - (a+b)
        p.append(c)

  return " ".join([str(c) for c in p])

n = int(input())
col = n-2
q = []
for _ in range(col) :
  li = list(map(int, input().split()))
  q.append(li)
print(answer(n, q))
답3 – 여기를 클릭하면 답이 보입니다
n = int(input())
 
triples = []
 
start = 0
start_val = 0
 
freq_idx = [0 for x in range(n + 1)]
triples = [0 for x in range(n - 2)]
 
for i in range(n - 2):
    triple = [int(x) for x in input().strip().split(" ")]
    triples[i] = triple
    for j in triple:
        if type(freq_idx[j]) != list:
            freq_idx[j] = list()
        
        freq_idx[j].append(i)
 
start = -1
end = -1
 
for i in range(1, n + 1):
    if len(freq_idx[i]) == 1:
        if start == -1:
            start = i
        else:
            end = i
            break
 
print(start, end=" ")
 
done = {freq_idx[start][0]}
last_triple = triples[freq_idx[start][0]]
 
cnt = 1
 
while cnt != n - 3:
    for t in last_triple:
        to_check = set(freq_idx[t]) - done
        if len(to_check) == 1:
            idx = next(iter(to_check))
            print(t, end=" ")
            last_triple = triples[idx]
            done.add(idx)
            cnt += 1
            break
 
end_triple = sorted(triples[freq_idx[end][0]], key=lambda x: len(freq_idx[x]), reverse=True)
print(" " .join([str(x) for x in end_triple]))