본문 바로가기

알고리즘

[programmers] 파일명 정렬 로직 - ls = [(head, numbers, 몇번째 파일인지), (head, numbers, 몇번째 파일인지), (head, numbers, 몇번째 파일인지)] 정렬한 후 sort한다. - ls만드는 방법 1) 정규식 사용 2) for문 돌리면서 직접 구현(내 코드) -> 이때, head, numbers의 index를 하나씩 바꿔가면서 최종적인 값 내기 - head : 숫자가 나오기 마지막 문자인 곳 numbers : 앞에서부터 숫자가 나온곳부터 시작해서 다시 문자열 나오기 바로전까지 tail : 굳이 나타낼 필요없다 -> tail로는 정렬하지 않기 때문 - 몇번째 파일인지 작성하는 이유 : 두 파일의 HEAD 부분과, NUMBER의 숫자도 같을 경우, 정렬 후에도 입력 시 주어진 두 파일의 순서가 .. 더보기
[programmers] 오픈채팅방 로직 - uid로 사람을 구분하기 위해서 dictionary에 key와 value값으로 하면 바뀔 때 값만 알아서 바꿔준다. - uid를 통해 enter, leave를 다 표현한 후, 마지막에 uid에 맞는 최종 이름을 넣어준다. 코드 def solution(record): answer = [] users = {} # {'uid1234':'M', 'uid1234':'P'} temp = [] # [['uid1234', '님이 들어왔습니다.' ]] -> 이후에 uid가 최종적으로 결정나면 그 값을 바꿔주기 for rec in record: log = rec.split(' ') enter = '님이 들어왔습니다.' leave = '님이 나갔습니다.' if log[0] == 'Enter': users[log[1.. 더보기
[programmers] 뉴스 클러스터링 로직 1. one, two를 대문자로 통일한 후, 합집합, 교집합을 구한다. ** 문제점 : union, interaction은 set일 때 사용가능 - set하게 되면 만약, one = ['AA', 'AA'], two = ['AA', 'AA', 'AA']라면 set_one = set_two = {'AA'}로 동일해진다 ** 해결책 : 1) Counter함수 사용해서 union, interaction를 사용한다. 2) make_interaction함수를 만들어 교집합만 구하면 one, two, interaction(one, two)갯수로 합집합을 구한다. 나는 2)을 택했다. 코드 def solution(str1, str2): def make_split(word): answer = [] for i in .. 더보기
[programmers] 튜플 로직 1. s = "{{2},{2,1},{2,1,3},{2,1,3,4}}" 를 s = [{2}, {2,1}, {2, 1, 3}, {2, 1, 3, 4}]로 바꾼 후 set안에 들어있는 갯수가 1부터 나열될 수 있도록 정렬한 후, result 안에 없는 값들만 넣어주기 2. 주의 : 원래 s[1:-1].split(',')해서 할랬는데, ['{20', '111}', '{111}']가 되어버린다. 이거를 문자열 안에 {}도 있어서 뽑아 내야하는 것들이 많다. -> s = s[2:-2].split('},{')하면 ['20, 111', '111']로 나온다. 코드 def solution(s): result = [] ss = s[2:-2].split('},{') # ['20,111', '111'] sss = sor.. 더보기
[programmers] 다트 게임 코드1 : 10을 다른 숫자나 문자로 치환 후 진행 # solution2(코드2)보다 0.01초 정도 빠르다 def solution1(dartResult): bonus = {'S': 1, 'D': 2, 'T': 3} options = ['*', '#'] answer = [] dartResult = dartResult.replace('10', 't') for i in range(len(dartResult)): if dartResult[i] in bonus: if dartResult[i - 1] == 't': answer.append(10 ** bonus[dartResult[i]]) else: answer.append(int(dartResult[i - 1]) ** bonus[dartResult[i]]) if.. 더보기
[baekjoon] 14888. 연산자 끼워넣기 로직 + 주의해야하는 점 1. 문제에서 말하는 그대로 +, -, x, %를 구분해 코드를 작성하면 된다 2. ** 문제점 : 나누기할 때, /로 나눈 다음에 int를 씌워서 나머지를 없앤다(처음에 //를 했다가 답이 제대로 안나옴) 코드 from itertools import permutations N = int(input()) numbers = list(map(int, input().split())) calcu = list(map(int, input().split())) eq = ['+', '-', '*', '/'] eq_t = [] for i in range(4): eq_t += eq[i] * calcu[i] result = list(permutations(eq_t, N-1)) answer = [] .. 더보기
[baekjoon] 14889. 스타트와 링크 로직 1. 조합으로 start팀 가능한 경우의 수를 모두 구한다음에 모든 경우에서 link팀도 구한다. 그래서 차이 비교하기 코드 from itertools import combinations N = int(input()) board = [list(map(int, input().split())) for _ in range(N)] # combination 함수로 만들기 people = [i for i in range(N)] start = list(combinations(people, N//2)) # // : 나눗셈 후 몫 반환, / : 7/4=1.25 all_people = set(people) mymin = 9999999999999999999999999999999999 for star in start: .. 더보기
[baekjoon] 13458. 시험감독 로직 1. 응시자에서 총감독관이 관리할 수 있는 사람들을 빼고, 부감독관들 명수를 구하면 된다. 이때, 총감독관만 있어도 괜찮은것인가에 대한 고민을 했지만, 코드를 짜다보니, 그런 예시가 나와도 크게 문제가 없을 것이라 생각이 되었다. 코드 N = int(input()) test = list(map(int, input().split())) B, C = map(int, input().split()) cnt = 0 for person in test: cnt += 1 if person >= B: person -= B if person % C == 0: cnt += person // C else: cnt += person // C + 1 print(cnt) 더보기