[백준/12759] 틱! 택! 토! - 파이썬
·
PS/BOJ&Programmers
📝 첫번째 시도 개인적으로 이 문제가 어려웠던 이유는 게임이 끝나고 승부를 판단하는 게 아니라 입력이 될 때 누가 언제 이기는지 알아내야 하기 때문에 헤맸다. 만약에 승부만 판단하는 문제였다면, 플레이어 1과 2가 했던 게임을 입력 받고 승부 조건만 확인하면 되기 때문이다. 그래서 처음에는 이렇게만 이해하고 다음과 같이 코드를 작성했다. # 먼저 시작하는 사람 n = int(input()) g = [[' ']*3 for _ in range(3)] for i in range(9): r,c = map(int, input().split()) # 게임판 if i % 2 == 0: g[r-1][c-1] = 'X' else: g[r-1][c-1] = 'O' # 승부 확인을 위해서 새로운 배열에 대입. res = [..
[백준/14582] 오늘도 졌다 / 야구에 대한 이해 / 파이썬 리스트 누적합
·
PS/BOJ&Programmers
🔎 문제 이해 평소 야구를 즐겨보지 않아서 그런지 초와 말에 대한 개념이 없었다. 그래서 처음엔 그냥 i번째에 이기고 있으면 역전패가 성립한다고 코드를 구현했는데 틀린 거다...! 질문 게시판을 통해 반례를 찾아보니 출제자가 그래서 문제 마지막에 경기는 1회초 -> 1회말 -> 2회초 -> ... -> 9회초 -> 9회말이라는 설명까지 덧붙인 듯하다. 역시 문제를 꼼꼼히 잘 읽는 것도 중요하다. 괜히 써진 문장은 없기 때문에 최대한 힌트를 많이 얻어가는 게 유리하다. 💡 파이썬 리스트 원소 누적합 게임은 현재까지 얻었던 점수들의 합으로 판단을 하기 때문에, 누적합을 구해서 승부를 판단했다. a = list(map(int, input().split())) b = list(map(int, input().sp..
[백준/3986] 좋은 단어 / 스택 / 스택 활용법 / 스택 원리
·
PS/BOJ&Programmers
아쉽게도 처음부터 이 문제를 보고 스택으로 풀어야겠다!! 라고 떠오른 건 아니다. 처음에 인덱스가 짝수인 / 홀수인 경우를 나눠서 세어보려고 했는데,, 알고리즘이 너무 복잡하고 변수도 쓸데없이 많다는 생각에 서치를 했다! 오래 고민하고 생각했는데도 내가 생각하는 알고리즘이 이상하다/도저히 모르겠다 싶을 땐, 빠르게 다음 스탠스를 취하는 것도 중요한 것같다.. 생각보다 아직 나는 아는 게 없기 때문이다. 그래도 괜찮다. 알고리즘 공부를 더욱 꾸준히, 열심히 해서 아는 영역을 넓혀 나가는 것이 이번 방학의 목표이기 때문에, 하루하루 정진하다보면 방학이 끝날 때 쯤엔 나도 아는 게 꽉꽉 차있을 테니까~~~~ 혹시 스택에 대해 모르신다면? https://cobinding.tistory.com/entry/%EC%..
[백준/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 sys n = int(sys.stdin.readline()) heap = [] # 자연수라면 in heap 0이라면 출력 + out heap for _ 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을 제공한다는 것이었다..! (from heapp 모듈) 📝 파이썬 heapq 모듈..
[백준/14912] 숫자 빈도수
·
PS/BOJ&Programmers
개요 문제 풀면서 int형을 str형으로 바꿔서 비교하는 건 여러번 해본 것같은데 기억이 나질 않아 이번엔 제대로 정리해보려 한다! int > str for i in range(1, n+1): for j in str(i): 위 코드의 의미는 1부터 n까지의 숫자(int)를 만들고, 그 숫자들을 str로 변형한다는 뜻이다. 숫자 빈도수 문제에서는 입력된 d에 해당하는 숫자와 같은 숫자의 빈도를 체크하라고 했으니, 이중 for문 아래에 다음과 같이 작성해주면 된다. 전체 코드 n,d = map(int, input().split()) cnt = 0 for i in range(1, n+1): for j in str(i): if j == str(d): cnt += 1 print(cnt) 프로그래밍을 C로 시작해서..
[백준/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, 실패함수..
sebinChu
'백준' 태그의 글 목록 (3 Page)