# 문제상황 1 시간 제한이 짧으므로 시간 단축을 위한 장치가 필요합니다. # 해결 1 import sys input = sys.stdin.readline 위와 같이 sys를 import하고 sys.stdin.readline() 함수를 이용해 사용자 입력을 받으면 시간을 단축할 수 있습니다. 매번 sys.stdin.readline()을 타이핑하기는 귀찮으니 input에 sys.stdin.readline을 할당하고 평소처럼 input을 사용합시다. # 문제상황 2 간단하게 생각해서 이 문제는 절댓값을 비교해서 가장 작은 값을 꺼내야 하므로, 우선순위 큐에 절댓값을 저장한다는 아이디어를 떠올릴 수 있습니다. 하지만 최종적으로 출력해야하는 값은 원본 값이므로 원본 값도 함께 알아야 합니다. 우선순위 큐에 절댓..
Algorithm
# 하노이 탑 원리 봉 3개를 각각 왼쪽에서부터 1번 봉, 2번 봉, 3번 봉이라고 하겠습니다. 우리의 목표는 1번 봉에 있는 원판들을 모두 3번 봉으로 옮기는 것입니다. 원판이 2개일 때를 살펴봅시다. 원판을 어떻게 움직여야 할까요? 1단계) 1번 봉에 있는 원판 하나를 2번 봉으로 옮깁니다. 2단계) 1번 봉에 있는 남은 원판 하나를 3번 봉으로 옮깁니다. 3단계) 2번 봉에 옮겨 놓았던 원판을 3번 봉으로 마저 옮깁니다. 이 세 단계가 하노이 탑 문제의 핵심입니다. 원판의 개수가 여기서 더 많아져도 모두 이 세 단계를 따릅니다. 원판이 3개인 경우를 살펴볼까요? 원판이 3개 이상일 때에도 원판이 2개 있다고 생각해야합니다. 원판이 어떻게 2개냐고요? 왼쪽 사진에서 제일 아래에 있는 원판 1개를 원판..
# 내 풀이 n = int(input()) l = [['' for i in range(n)] for i in range(n)] def blank(n, x, y): for i in range(n): for j in range(n): l[x-n//2+i][y-n//2+j] = ' ' def f(n, x, y): if n == 3: l[x-1][y-1] = '*' l[x-1][y+0] = '*' l[x-1][y+1] = '*' l[x+0][y-1] = '*' l[x+0][y+0] = ' ' l[x+0][y+1] = '*' l[x+1][y-1] = '*' l[x+1][y+0] = '*' l[x+1][y+1] = '*' else: f(n//3, x-n//3, y-n//3) f(n//3, x + 0, y-n//3)..
내 풀이 def solution(id_list, report, k): a = {} # {멤버id : 신고당한 횟수} b = {} # {멤버id : 나를 신고한 아이디 list} c = {} # {멤버id : 정답} for i in id_list: a[i] = 0 b[i] = [] c[i] = 0 for i in report: if b[list(i.split())[1]].count(list(i.split())[0]) == 0: a[list(i.split())[1]] += 1 b[list(i.split())[1]].append(list(i.split())[0]) for i in a: if a[i] >= k: for j in b[i]: c[j] += 1 return list(c.values()) 1. 멤버id..
# 문제상황 문자열 s가 있고, s에 있는 문자 하나 하나를 조사하고 싶을 때 우리는 보통 아래와 같은 코드를 자주 사용합니다. for i in s: 위 코드에서 i에는 문자열 s에 담긴 '문자'들이 담기게 됩니다. 만일 i에 '문자'를 직접 받아오는 게 아니라, 문자열의 '인덱스'를 받아오고 싶다면 아래와 같이 코드를 짜면 됩니다. for i in range(len(s)): 위 코드에서 실제 문자 값을 참조하고 싶다면 's[i]'와 같이 표기하면 되겠죠. 하지만 위 코드에는 한 가지 문제가 있습니다. i번째 인덱스를 참조하고 있을 때, 동시에 i + 1번째 인덱스를 참조하는 것이 불가능하다는 점입니다. 만일 i가 문자열 s의 마지막 인덱스를 참조하고 있을 경우, i + 1번째 인덱스를 참조하려고 시도하..
https://www.acmicpc.net/problem/1157 # 문제상황 이 문제에서 생각해볼 만한 부분은, '최댓값이 여러 개 존재할 경우'를 처리하는 방법입니다. 파이썬의 내장 함수 중 max() 함수가 있지만, max() 함수는 최댓값이 여러 개 존재할 경우를 따로 처리해주지 못합니다. 어떻게 하면 좋을까요? # 해결 리스트의 count() 함수를 적절히 사용하여야 합니다. count() 함수는 리스트에서 '특정 요소가 몇 개 들어있는지'를 알려주는 함수인데요, 즉 다음과 같은 순서로 문제를 풀면 됩니다. 1. max() 함수로 최댓값을 알아내기 2. 알아낸 최댓값을 count() 함수에 넣어, 최댓값이 몇 개인지 알아내기 3. 최댓값이 1개라면 리스트는 유일한 최댓값을 가지는 셈이고, 2개 ..
https://www.acmicpc.net/problem/11720 # 문제상황 x = list(str(input())) sum = 0 for i in x: sum += int(i) 저는 맨 처음에 이렇게 코드를 짰었는데요, 실로 비효율적인 코드입니다. 첫 번째로, input() 함수를 통해 입력받는 모든 값들은 '문자열' 자료형으로 입력받습니다. 즉, 1행의 'str(input())' 이라는 코드는 완전히 삽질하는 코드인 셈이죠. 두 번째로, 'for i in x:' 에서 x 자리에는 반복 가능한 자료형만 들어올 수 있으면 됩니다. 반복 가능한 자료형에는 문자열, 리스트, 튜플, 딕셔너리, 집합이 있죠. 저는 x 자리에 반드시 리스트만 올 수 있다고 생각해서 1행에 굳이 'list()' 함수를 사용했었..
https://www.acmicpc.net/problem/4344 # 문제상황 이 문제는 '소수점 셋째 자리까지' 라는 출력 형식이 있습니다. 보통 실수 40을 그냥 출력하게 되면 '40.0'이라고만 출력되지, '40.000'이라고 출력되지 않습니다. 소수점 둘째 자리, 셋째 자리에 있는 0은 생략되죠. 어떻게 하면 '40.000'과 같은 출력 형식을 지킬 수 있을까요? # 해결 소수점의 출력 형식을 지키기 위해서는 문자열 포매팅을 하는 방법을 알아야 합니다. 문자열 포매팅의 방법에는 1. 포맷 코드를 이용하는 방법 2. format 함수를 이용하는 방법 3. f 문자열 포매팅 이렇게 총 3가지 방법이 있는데, 그 중에서 가장 간결하게 코드를 짤 수 있는 'f 문자열 포매팅' 방법을 사용할 것입니다. f..
https://www.acmicpc.net/problem/2562 # 문제상황 제가 제일 처음에 고안한 답은 아래와 같습니다. max = 0 idx = 0 for i in range(9): x = int(input()) if x > max: max = x idx = i + 1 print(max) print(idx) 하지만 생각해보면 자동으로 최댓값을 찾아주는 max()라든지, 파이썬에서 기본으로 제공해주는 유용한 내장함수들을 거의 쓰지 않은 답안입니다. 파이썬 내장함수를 이용해서 좀 더 효율적인 코드를 짤 순 없을까요? # 해결 우선 앞서 언급했듯이 max() 함수와 리스트의 index() 함수를 이용해 좀 더 간결하게 문제를 풀 수 있습니다. max()는 함수 이름에서 쉽게 유추할 수 있듯, 반복 가능..
https://www.acmicpc.net/problem/10871 # 문제상황 1 백준 단계별로 풀어보기를 순서대로 풀어보고 있는 사람들이라면 아마 이 문제에서 처음으로 '수열'을 입력받는 방법에 대해 고민하셨을겁니다. 그동안은 많아봐야 연속된('띄어쓰기'로 구분된) 2개의 수를 입력받는 문제들만 있었죠. 그런 문제상황에서는, a, b = map(int, input().split()) 위와 같은 코드를 구현하면 됐었습니다. 하지만 아래 예시입력과 같이 연속된 3개 이상의 여러 개의 숫자들을 입력받으려면 어떻게 해야할까요? # 해결 1 파이썬에서 제공하는 '리스트'를 사용합니다. 리스트는 여러 개의 값들을 효율적으로 저장할 수 있는 자료형입니다. 기존에 자주 사용했던 'map(int, input().sp..