[백준/10819] 차이를 최대로 | 모든 순서를 고려한 배열.. permutation | 리스트 갱신법이 항상 효율적일까?
·
PS/BOJ&Programmers
알고리즘1. 모든 배열 케이스를 확인해주기 위해서 permutarion으로 배열 케이스를 모두 생성해준다.2. 생성된 배열 케이스의 |A[0] - A[1]| + |A[1] - A[2]| + ... + |A[N-2] - A[N-1]|를 확인해준다. 최종코드 from itertools import permutationsn = int(input())li = list(map(int,input().split()))per = permutations(li)ans = 0for i in per: case = 0 for j in range(1, len(i)): case += abs(i[j-1] - i[j]) if case > ans: ans = caseprint(an..
[백준/3029] 경고 | 파이썬
·
PS/BOJ&Programmers
알고리즘시간 계산을 할 때 주의할 점은 24시간이 넘어갔냐 아니냐를 컴퓨터가 판단하도록 지시해야 하는 것이다.20시와 4시는 숫자만 봤을 때 당연히 20이 더 크지만, 만약 다음날 4시를 뜻하는 거라면 4시가 더 늦은 시간이기 때문에, 이를 컴퓨터가 알아차리도록 해야 한다. 이 문제의 예시에는 두 가지 케이스가 잘 나와있다.첫 번째 케이스는 다음날 새벽 4시를 뜻하므로 이미 24시간이 넘어간 경우이기 때문에 이를 계산할 때 주의해야 한다.두 번째 케이스는 같은 날 오후를 뜻하므로 그냥 계산해도 상관없다. 넘어간 24시간은 어떻게 표현할 수 있을까만약 24(시) * 60(분) * 60(초) = 86400을 넘어간다면 00:00:00 ~ 23:59:59 로 표현할 수 있도록 t의 값을 86400으로 나눈 나..
[백준/15656] N과 M(7)
·
PS/BOJ&Programmers
(1,3) (3,1)같은 경우도 모두 출력(중복 순열)을 해주어야 하기 때문에 파이썬 itertools의 product를 사용했다. 1번 코드from itertools import product as pn,m = map(int,input().split())num = list(map(int,input().split()))num.sort()num = map(str, num)ans = map(' '.join, p(num, repeat=m))print('\n'.join(ans)) 2번 코드from itertools import product as pn,m = map(int,input().split())num = sorted(list(map(int,input().split())))for i in p(num,rep..
[백준/11383] 뚊 | 2차원 이미지 | 행렬 한줄씩 걷어내기(?)
·
PS/BOJ&Programmers
알고리즘N x M 크기의 '이미지'와 N x 2M 크기의 '이미지'가 주어지는 거라서 행렬로 생각하는 게 더 수월하다.처음에 헷갈렸던 점은 일단 큰 for문 안에서 비교를 해야 하는데 입력이 NxM크기의 이미지가 먼저 들어온 다는 거다.그러면for _ in range(n): img1 = input() img2 = input() 이런식으로도 받을 수 없기 때문에..(리스트인 경우도 마찬가지)n,m = map(int,input().split())img1 = [input() for _ in range(n)]img2 = [input() for _ in range(n)] 이렇게 한 줄 for문으로 입력을 받아주었다. 또한, img2(Nx2M 그림)와 img1을 늘린 ans를 한 줄씩 비교..
[백준/1942] 디지털시계 | 1초씩 증가 => while t += 1
·
PS/BOJ&Programmers
시간 표현(시,분,초)시/분/초를 나눠서 구현해야 하는 문제는 알고리즘을 모르면 꽤 돌고 돌아서 구현을 하는 경우가 생긴다. (유경험자)이 문제에서는 3으로 나누어 떨어지는 시계 정수의 개수를 구해야 하지만,시간 문제를 푸는 방법에 집중하여 포스팅하려 한다. (복습용으로..🤓) 시: 0부터 24까지의 숫자로 나타낼 수 있음. 60분에 1시간이므로 분값이 60으로 증가되었을 때, 분 변수는 0으로 초기화되고 시 변수는 +1분: 0부터 60까지의 숫자로 나타낼 수 있음. 60초에 1분이므로 60초가 되었을 때 초 변수는 0으로, 분 변수에는 +1 추가초: 0부터 60까지의 숫자로 나타낼 수 있음.# 표현 방법 if s1 == 60 : m1 += 1; s1 = 0 if m1 == 60 : h1 += 1; m..
[백준/2309] 일곱 난쟁이 | sorted()를 반복문의 대상으로
·
PS/BOJ&Programmers
알고리즘들어오는 순서에 상관없이 숫자 7개의 합을 100으로 맞춰야 하기 때문에 파이썬 itertools의 combinations를 사용했다.알고리즘은 잘 생각했는데 출력물이 깔끔하지 않아서 아쉬웠다. 다른 사람의 코드를 보니 sorted를 for문의 반복횟수로 지정해주었다. 파이썬 for문은 어떤 시퀀스(sequence)를 반복하는 문법이므로 sorted가 반복횟수가 될 수 있는 것이다. 최종 코드from itertools import combinations as combt = []h = 0for _ in range(9): t.append(int(input())) for i in comb(t,7): if sum(i) == 100: i = list(i) i.sor..
[자료구조] 트리(Tree)
·
PS/Data Structure
트리트리란? 회사의 조직도, 가계도와 같이 나무처럼 뻗어나가는 모양의 사이클이 없는 그래프다. 노드간선루트 노드: 트리의 맨 꼭대기부모 노드/자식 노드리프 노드: 자식이 없는 노드차수와 깊이 그리고 높이차수: 특정 노드의 자식 수깊이: 특정노드로부터 루트노드와 떨어져있는 정도높이: max깊이 + 1이진트리트리의 자식을 2개로 한정하면, 이진트리배열로 나타내기 좋다. 부모는 i, 왼쪽 자식은 i2, 오른쪽 자식은 i2+1만약 모든 자식이 꽉 차있지 않다면 배열도 같이 비워줘야한다.이진트리는 한번 알면 여러모로 편하다.. 자식이 2개로 제한되어 있기 때문에 구현도 좋다… 그러니 확실하게 알아둘 것! 트리의 순회트리를 탐색하는 순회 방법은 3 가지가 있다.전위 순회(왼>뿌>오)중위 순회(뿌>왼>오)후위 순회(..
[백준/10809] 알파벳 찾기 | find() 찾고자 하는 문자의 인덱스를 반환
·
PS/BOJ&Programmers
알고리즘파이썬 내장함수 find와 아스키코드를 활용하여 문제를 풀 수 있다.find 함수는 해당 문자열에서 괄호 안의 문자가 몇 번째에 나타나는지 인덱스를 반환한다.만약, 해당 문자가 없다면 -1을 반환한다. 소문자 a부터 z까지의 아스키 코드 넘버는 97부터 122까지다.(대문자 A to Z는 65 ~ 90이다.) 전체 코드s = input()alpha = list(range(97,123)) # a ~ zfor i in alpha: print(s.find(chr(i))) 소문자 알파벳 전체를 아스키 코드로 (97번부터 122번까지) 리스트에 저장한다.저장된 소문자 알파벳 아스키 코드를 for문으로 돌면서 포함되었는지, 아닌지 확인해주면 된다!
[백준/1436] 영화감독 숌
·
PS/BOJ&Programmers
처음 작성한 코드처음에 숫자를 while 문에서 계속 +1 해주고idx를 설정해서  n번째가 나오면 break를 해주는 코드를 작성했다. n = int(input())i = 0num = 665while True: num += 1 s_num = str(num) i += 1 if '666' in s_num and i == n: print(s_num) break 코드를 보면 검사할 필요가 없는 idx 번호까지 즉, 종말의 숫자가 아닌 것까지 카운트를 하기 때문에 잘못된 구현이다. 최종코드n = int(input())i = 0num = 665while True: num += 1 s_num = str(num) i += 1 if '666..
[백준/4949] 균형잡힌 세상 | Stack
·
PS/BOJ&Programmers
알고리즘전형적인 스택 문제다. 우선 괄호의 여는 부분이 왼쪽으로 와야 하기 때문에, 문자열을 돌면서 ( 나 [ 일 때 스택에 넣어준다.만약 스택에 값이 들어있는데 )나 ]가 들어오면 ( or [ 와 짝이 맞아야 하므로, 스택의 탑(stack[-1])을 통해 쌍이 맞는지 확인하고,쌍이 맞다면 스택에서 여는 괄호를 팝해서 스택을 비워준다.쌍이 아니라면 스택에 닫힌 괄호를 넣어준다. 이 알고리즘을 입력 받은 문자열을 모두 검사할 때까지 반복한다. 최종 코드while True: s = input() if s == '.': break stack = [] for i in range(len(s)): if s[i] == '(' or s[i] == '[': stack..
[Python] 파이썬 lambda(익명함수) 함수로 정렬하기
·
언어/PYTHON
파이썬 정렬정렬 메소드인 sort()와 함수 sorted()는 디폴트 값이 오름차순이고, 내림차순으로 정렬을 하기 위해서 reverse 인자를 추가한다. arr = [10, 3, 4, 2, 100]arr.sort(reverse = True)print(arr)# [100, 10, 4, 3, 2]  arr = [10, 3, 4, 2, 100]arr.sorted(arr, reversed = True)print(arr)# [100, 10, 4, 3, 2] * reversed 인자 이외에도 [::-1]을 이용하여 정렬할 수 있다.  lambda(익명함수)어떤 리스트를 정렬하기 위해서는 다양한 기준을 활용할 수 있는데, reversed 인자처럼 key 인자를 활용하면 된다.여기서 lambda(익명 함수)가 key에..
[백준/14592] 2017 아주대학교 프로그래밍 경시대회(small) - 파이썬
·
PS/BOJ&Programmers
알고리즘N의 크기가 1이 문제를 구현하면서 조건 거를 때 if 문 사용과 중복을 어떻게 걸러낼 것인지에 대해서 조금 익숙해진 것을 느꼈다.  최종 코드n = int(input())total = []cnt = []t = []for _ in range(n): s,c,l = map(int, input().split()) total.append(s) cnt.append(c) t.append(l) for i in range(n): # 같은 값이 존재하면 if total.count(total[i]) >= n: # 제출 횟수 같은 경우 if cnt.count(cnt[i]) >= n: print(t.index(min(t))+1) ..
sebinChu
Studying IT with cobinding