백준 1459번 - 걷기

백준 1459번 바로가기 나의 풀이 x, y, w, s = map(int, input().split()) a=max(x,y) b=min(x,y) ans = 0 if 2*w > s: ans += b*s else: ans += b*2*w if w > s: if (c:=(a-b)) % 2 == 0: ans += c*s else: ans += (c-1)*s + w else: ans += (a-b)*w print(ans) 고수의 풀이 x,y,w,s = map(int, input().split()) x,y = min(x,y), max(x,y) m = (x + y) % 2 print(min((x+y)*w, x*s+(y-x)*w, (y-m)*s+m*w)) 출처 CODE REVIEW case_work에 해당하는 문제답게 경우를 쪼개서 풀어내는 것이 풀이의 핵심이다. 나의 경우엔 직사각형을 정사각형과 직사각형으로 쪼개서 풀었다. 앞의 if문이 정사각형 이동, 뒤의 if문이 직사각형 이동을 나타낸다. 고수의 풀이같은 경우 세 가지 경우로 쪼개서 풀어냈다. 대각선으로만 이동하는 경우 직선으로만 이동하는 경우 두 경우를 혼용하는 경우

2023-5-22 · 1 min · 118 words · Junha

백준 10828번 - 스택

백준 10828번 바로가기 백준 10866번, 백준 10845번과 매우 유사한 문제. 세부 조건만 잘 따져주면 쉽게 해결 가능하다. 나의 풀이 n,*l=open(0) a=[] for i in l: if (cmd:=(q:=i.split())[0]) == 'push': a.append(q[1]) elif cmd == 'pop': print(a.pop() if a else -1) elif cmd == 'size': print(len(a)) elif cmd == 'empty': print(0 if a else 1) elif cmd == 'top': print(a[-1] if a else -1) CODE REVIEW 역시 open(0)을 이용해서 풀어내야 시간초과 제한에서 쉽게 벗어날 수 있다. 바다코끼리 연산자를 이용하여 같은 코드 반복을 피할 수 있다.

2023-5-18 · 1 min · 83 words · Junha

백준 10845번 - 큐

백준 10866번 바로가기 백준 10845번과 매우 유사한 문제. 세부 조건만 잘 따져주면 쉽게 해결 가능하다. 나의 풀이 n,*l=open(0) a=[] for i in l: if (cmd:=(q:=i.split())[0]) == 'push': a.append(q[1]) elif cmd == 'pop': print(a.pop(0) if a else -1) elif cmd == 'size': print(len(a)) elif cmd == 'empty': print(0 if a else 1) elif cmd == 'front': print(a[0] if a else -1) elif cmd == 'back': print(a[-1] if a else -1) 고수의 풀이 s=[];p=print for o in [*open(0)][1:]: match o[1]: case "u":s.append(o.split()[1]) case "o":p(s.pop(0)if s else-1) case "i":p(len(s)) case "m":p(0 if s else 1) case "r":p(s[0]if s else-1) case "a":p(s[-1]if s else-1) 출처 CODE REVIEW match-case문을 처음 봤는데 case을 나누고 해당하는 case마다 코드를 실행하는 방식이다. if else 조건문과 비슷하지만 코드가 한결 간단해진다. 처음에는 input()이용해서 풀었는데 시간초과 뜨길래 open(0)으로 받는 방식으로 바꾸었다. 백준은 이런 시간 초과 문제가 은근 신경쓰이게 한단 말이지…ㅂㅇㅂ 이번에도 바다코끼리 연산자를 편리하게 이용했다. 다음에 한번 이 연산자에 대한 포스팅을 올려봐야겠다.

2023-5-18 · 1 min · 150 words · Junha

백준 10866번 - 덱

백준 10866번 바로가기 첫 번째 시도 class Deque: def __init__(self): self.deque = [] def push_front(self, x): self.deque = [int(x)] + self.deque return def push_back(self, x): self.deque = self.deque + [int(x)] return def pop_front(self): if self.deque == []: return -1 else: n = self.deque[0] self.deque = self.deque[1:] return n def pop_back(self): if self.deque == []: return -1 else: n = self.deque[-1] self.deque = self.deque[:-1] return n def size(self): n = len(self.deque) return n def empty(self): if self.deque == []: return 1 else: return 0 def front(self): if self.deque == []: return -1 else: return self.deque[0] def back(self): if self.deque == []: return -1 else: return self.deque[-1] dq = Deque() for _ in range(int(input())): cmd = input().split() if cmd[0] == "push_front": dq.push_front(int(cmd[1])) elif cmd[0] == "push_back": dq.push_back(int(cmd[1])) elif cmd[0] == "pop_front": print(dq.pop_front()) elif cmd[0] == "pop_back": print(dq.pop_back()) elif cmd[0] == "size": print(dq.size()) elif cmd[0] == "empty": print(dq.empty()) elif cmd[0] == "front": print(dq.front()) elif cmd[0] == "back": print(dq.back()) 호기롭게 Deque을 구현해보자!해서 class을 만들었지만 태생이 list인지라 역시나 시간초과에 걸렸다. 답은 올바르게 나오지만(ㅋㅋ) class 연습했다고 생각하자. ...

2023-5-18 · 2 min · 349 words · Junha

백준 15829번 - Hashing

백준 15829번 바로가기 나의 풀이 ans = 0 n = 0 _ = int(input()) for i in input(): ans += (ord(i)-96) * (31**n) n += 1 print(ans) CODE REVIEW 한참 암호화폐와 블록체인에 열광이 불었을 때에 해시함수에 대해 알게된 기억이 있다. nomad coders 니코가 설명한 해시 함수도 잘 설명되어있다. 해시 함수는 입력에 대한 출력을 찾기 쉽지만, 반대로 출력값을 보고 입력을 유추하기는 어렵기에 암호보안에 많이 쓰인다고 들었다. 문제로 돌아오게 되면, 위에서 간단하게 짠 코드의 경우 50점 부분점수를 받았다. 길이가 5이하인 경우는 커버했지만, 길이가 50까지 길어지면 커버할 수 없다는 건데 어딜 고치면 보완할 수 있을까? 답은 이미 문제에 제시되어있었는데, 해시 함수를 mod M으로 modulo을 이용했으므로, 큰 소수인 숫자 M=1234567891로 나눠준 나머지를 구하면 된다. ans부분만 (ans % 1234567891)로 수정하면 된다! ...

2023-5-18 · 1 min · 116 words · Junha