[백준/11179] 2진수 뒤집기
·
PS/BOJ&Programmers
이 문제는 2진수 -> 10진수 변환과 10진수 -> 2진수 변환 모두를 구현해야 하는 문제이다. 파이썬 내장 함수와 문자열 인덱싱을 통해 쉽게 구현할 수도 있지만, 직접 코드를 작성해보았다. 💻 최종 코드 n = int(input()) b = [] x = 0 ans = [] c = 0 while n != 0: if n % 2 == 0: b.append('0') else: b.append('1') n //= 2 # 뒤에서부터 append 되니까 어차피 뒤집혀 나옴 s = ''.join(b) for i in range(len(s)-1,-1,-1): x = int(s[i]) * 2 ** c ans.append(x) c += 1 print(sum(ans)) while 문은 10진수를 이진수로 변환한 코드이다...
[백준/2947] 나무 조각/정렬/두가지 풀이
·
PS/BOJ&Programmers
💻 내 풀이 직관적인 풀이라고 생각하지만 정석보다 우회해서 푼 느낌이라 코드를 더 찾아봤다. t = input().split() tmp = 0 s = sorted(t) while True: for i in range(1,len(t)): if t[i-1] > t[i]: tmp = t[i-1] t[i-1] = t[i] t[i] = tmp print(*t) if t == s: break 💻 다른 풀이 t = input().split() for j in range(len(t)): for i in range(1,len(t)): if t[i-1] > t[i]: t[i-1], t[i] = t[i], t[i-1] print(*t) 내 기억상 이게 버블소트랑 가장 가까웠던 것같다. 출처: https://it-garden..
[백준/6996] 애너그램.. 반례찾기
·
PS/BOJ&Programmers
🔎 처음시도 n = int(input()) for _ in range(n): a, b = input().split() cnt = 0 for i in a: if i in b: cnt += 1 if cnt == len(a) and len(a) == len(b): print('{} & {} are anagrams.'.format(a,b)) else: print('{} & {} are NOT anagrams.'.format(a,b)) 반례: aaaa aaab. 이유: if i n b 코드에서 변수 a와 변수 b가 가진 a의 개수에 상관없이, 포함되어있는지 아닌지만 판단했기 때문에, 오류 발생.. 그래서 a,b 서로서로 검사해주는 코드로 바꿨는데 또 .. 틀린거다... 틀린 이유는 똑같음.. 같은 어미가 있을 때..
[백준/1159] 농구경기
·
PS/BOJ&Programmers
🔎 문제 이해 오늘 딕셔너리를 공부해서 그런지 보자마자 첫글자를 key값으로 넣고, 다음 입력값의 첫글자가 이미 딕셔너리 key로 저장되어 있다면 +1 해주는 로직이 떠올랐다. 📝 첫번째 시도 _ 실패 n = int(input()) d = {} for i in range(n): name = input() key = name[0] # 만약 이미 d에 key 값이 존재하는 경우 if d.get(key): d[key] += 1 else: d[key] = 1 ans = list(d.values()) for i in ans: if i >= 5: for k,v in d.items(): print(k) 첫번째 시도 모든 key 값을 출력해버림. 당연하다. items 함수를 통해 딕셔너리의 key값을 구했기 때문이다...
[백준/5704] 팬그램/ 카운트, 딕셔너리
·
PS/BOJ&Programmers
🔎 처음 시도 이중 포문으로 하나하나 비교하면 되겠지?라는 생각으로 모두 비교해줬는데, 이렇게 하면 입력이 한꺼번에 주어졌을 때 밀리는 현상 때문에 올바르게 판단을 못한다. 얘가 검사를 다할 때까지 sleep을 건다고 쳐도, 잘못된 알고리즘인 것같다는 생각이 들었다. 어쨌든 문자열을 보려면 모든 문자열을 다 확인해봐야 하는데,, 어떻게 할까 하다가 알게된 find 함수. str.find(찾고자하는 문자열) 형식으로 사용된다. 만약 값을 찾으면 str의 해당 인덱스가 반환되고, 없으면 -1을 반환한다. 🤔 두 번째 시도 cnt = 26 # 총 알파벳 개수 while True: sentence = input() sentence.replace(" ", "") if sentence == '*': break fo..
[백준/1551] 수열의 변화
·
PS/BOJ&Programmers
💻 최종 코드 n,k = map(int, input().split()) num = list(map(int, input().split(','))) for _ in range(k): ans = [] # 초기화 for i in range(1,len(num)): sub = num[i] - num[i-1] ans.append(sub) num = ans # num을 계산한 값으로 초기화 print(*num, sep=',') 크게 어려운 알고리즘은 필요없지만, for문의 구조와 초기화해서 값을 갱신한다는 지식이 없으면 풀기 힘들 것같다..! 생각은 떠올랐지만, 구현하는 데에 좀 시간이 걸렸다. 이중 포문에 조금 더 익숙해져야겠다는 생각이 들었다.
[백준/4458] 첫 글자를 대문자로
·
PS/BOJ&Programmers
🔎 두 가지 방법 이 문제를 구상할 때 문자열은 불변 데이터니까 새로 정의해줘야 하는 번거로움을 피하기 위해 list로 작성했다. 하지만 (이 경우에 한해서) 둘의 속도 차이는 별로 크지 않았고, 두 방법을 적재적소에 사용하기 위해 다 익혀놓는 것이 좋을 거라 생각해서 두 가지 모두 구현해보았다. 💻 list를 활용한 구현 n = int(input()) for _ in range(n): s = list(input()) s[0] = s[0].upper() print(''.join(s)) 파이썬의 join 함수를 활용하여 리스트를 문자열로 변경해주었다. 💻 문자열을 활용한 구현 n = int(input()) for _ in range(n): s = input() new = s[0].upper()+s[1:] ..
[백준/11723] 집합
·
PS/BOJ&Programmers
💻 전체 코드 import sys n = int(sys.stdin.readline()) s = set() for _ in range(n): words = sys.stdin.readline().split() command = words[0] if command == 'add': s.add(int(words[1])) elif command == 'remove': s.discard(int(words[1])) elif command == 'check': if int(words[1]) in s: print(1) else: print(0) elif command == 'toggle': if int(words[1]) in s: s.discard(int(words[1])) else: s.add(int(words[1])..
[백준/1934] 최소공배수 feat. 유클리드 호제법
·
PS/BOJ&Programmers
📝 정수론_ 최소공배수 정수론은 정수를 다루는 학문으로, 약수와 배수/몫과 나머지에 대해 탐구한다. 컴퓨터 발달 이후 정수론의 유용성은 급상승했다. 현대 암호의 원리가 두 개의 큰 소수를 곱하는 것은 쉽지만, 이 결과를 다시 소인수분해하는 것이 어렵다는 것이 기반이기 때문이다. 뿐만 아니라 컴퓨터를 이용한 계산이나 메모리 설계 등에서도 정수론은 다양하게 쓰인다! 최소공배수(LCM, Least Common Multiple)는 최대공약수(GCD, Greateast Common Division)와 함께 정수론의 첫 번째 내용이다. 앞의 유클리드 호제법에서 유클리드 알고리즘을 통해 GCD와 LCM을 다루었으니, 이 포스팅에서는 내장함수를 기록하겠다. 💻 전체 코드 import sys import math n =..
[백준/1927] 최소 힙
·
PS/BOJ&Programmers
문제를 잘 이해하면 구현은 어렵지 않다.✍️ 첫번째 시도import sysn = int(sys.stdin.readline())heap = []# 자연수라면 in heap 0이라면 출력 + out heapfor _ in range(n): x = int(sys.stdin.readline()) if x == 0 and len(heap) != 0: print(min(heap)) heap.remove(min(heap)) elif x != 0: heap.append(x) else: print(0)혼자서 문제에 따라 잘 구현한 것같은데,, 시간 초과ㅠㅠ구글링 후 알게된 점은 파이썬에서 따로 heappush, heappop을 제공한다는 것이었다....
[백준/1157] 글자 공부
·
PS/BOJ&Programmers
처음 쓴 코드 str = input() size = len(str) cnt = [0 for i in range(size)] # 입력 받은 문자열의 size 만큼 배열 선언 (카운팅을 위해) for i in range(size): for j in range(i+1, size): if str[i] == str[j]: # 이중 포문으로 문자열 서로서로 비교 cnt[i] += 1 # 같은 문자열이 나오면 cnt 배열을 + 해준다. for i in range(len(cnt)): if cnt[i] == cnt[i+1]: print('?') exit() m = max(cnt) if m == 1: print(str.upper()) else: print(str[m].upper()) 사실 알고리즘 시간에 kmp, 실패함수..
[백준/2420] 사파리월드
·
PS/BOJ&Programmers
x, y = map(int, input().split()) print(abs(x-y)) 이렇게 파이썬에서 제공하는 절댓값 함수 abs()를 사용해도 되지만, 새싹 문제의 조건문 분야인 만큼 조건문을 통해 문제를 풀어보자. x, y = map(int, input().split()) if y>x : print(-(x-y)) else: print(x-y)
sebinChu
'알고리즘' 태그의 글 목록 (3 Page)