망나니 AWOS의 일상
article thumbnail
[python] 백준 2863번 이게 분수?
알고리즘/백준 2021. 10. 14. 21:54

문제 풀이 2*2짜리 표 -> 2차원 배열을 이용 시계방향으로 회전 후에 4회전 시에는 원점으로 돌아오기 때문에 회전을 담당해줄 메서드, 표의 값을 계산해줄 메서드가 필요. 값을 스왑 해주기 위해 시계방향으로 1회전, 2회전, 3회전 돌렸을 때의 좌표값들을 적어보았고 그 좌표값들을 스왑 해주기 위해 temp 변수를 하나 초기화해주어 swap 해주었다. 간단하게 if문으로 돌릴 수도 있었겠으나 요즘은 배열에 대해서 좀 연습을 하는 중이라서 배열을 써보았다. 완성된 코드!!😀😀 # swap def swap(l): temp = l[0][0] l[0][0] = l[1][0] l[1][0] = l[1][1] l[1][1] = l[0][1] l[0][1] = temp return l # 계산 def cal(l): ..

article thumbnail
[python] 백준 2052번 지수연산
알고리즘/백준 2021. 10. 1. 22:10

문제 요약 및 풀이 문제 자체는 간단하다. 2의 -N승을 계산하면 된다. 하지만 기본적으로 표현할 수 있는 소수점 자릿수를 넘어가게 되면 e^n, e^-n으로 표기가 된다. 그래서 표현할 수 있는 소수점 자리수를 늘리려면 늘리고 싶은 자리 개수를 sosu_N이라고 생각하면 "%. sosu_Nf"와 같이 만들어 주면 된다. 대략 sosu_N을 300으로 조절하면 아래와 같은 결과를 볼 수 있다. 0 같은 경우 rstrip() 메서드를 통해 오른쪽에 있는 0을 지워주면 된다. 완성된 코드!! 😀😁 print(("%.300f" % (1/(2**int(input())))).rstrip("0"))

article thumbnail
[python] 백준 2154번 수 이어 쓰기 3
알고리즘/백준 2021. 9. 29. 21:41

문제 요약 및 풀이 문제는 간단하다. N 15를 입력받았을 때 해당 15가 몇 번째에 나타나는지만 알면 된다. 먼저 N의 범위가 1 ≤ N ≤ 100,000 이기 때문에 1부터 100000까지 문자열로 붙여준 후에 find나 index 함수로 해당 위치의 값을 뽑아주면 된다. 단지 find나 index의 값이 0부터 시작이기 때문에 1을 더해주고 결과를 반환해주면 된다. ex) 입력이 1이라면 1번째라고 결과가 나와야 하지만 배열에서 index는 0부터 시작이기 때문에 결과가 0이 나오게 된다. 완성된 코드!!😀😀 s = "" for i in range(1, 100001): s += str(i) print(s.index(input())+1)

article thumbnail
[python] 백준 20112번 사토르 마방진
알고리즘/백준 2021. 9. 21. 18:04

문제 요약 및 풀이 N을 입력받으면 N X N 만큼 크기의 단어 집합이 만들어진다. 이 단어 집합은 가로 단어와 세로 단어가 같다. (사토르 마방진의 개념) 사토르 마방진이면 YES를 아니면 NO를 출력 2차원 배열로 풀 생각으로 그려보았다. N X N 만큼이라고 했으니 2차원 배열로 [N][N] 크기만큼 두 개의 배열을 만들어 놓는다. 사토르 마방진은 가로 단어와 세로 단어가 같다고 했기 때문에 두 개의 배열(가로 단어 집합, 세로 단어 집합)을 만들어야겠다고 생각했다. 입력받는 값들을 보면 가로로 단어를 입력받기 때문에 해당 집합을 그림과 같이 나타내 보면 세로는 대칭이라고 볼 수 있다. 2차원 배열의 특징인 [i][j]를 [j][i]로 스왑 하여 세로 단어 집합의 배열을 만들면 된다. 이해가 잘 되..

article thumbnail
[python] 백준 11723번 집합
알고리즘/백준 2021. 9. 16. 22:46

문제 풀이 및 요약 문제 이해가 잘 안 되시는 분들에게 직접 그림을 그려서 보여드리겠다. check x를 통해서만 x가 있는지 없는지를 판단하여 있으면 1을 출력, 없으면 0을 출력한다. 나머지 add, remove, toggle / empty, all 등은 값 삽입, 삭제가 이루어진다. 문제에도 나와 있다시피 집합이기 때문에 set()을 써야 한다. 얼핏 보면 set 도 {} 중괄호를 사용하고 있어 {} 중괄호를 사용하는 딕셔너리와 헷갈릴 수도 있으나 set 같은 경우 값이 하나 {1, 2, 3}이고 딕셔너리 같은 경우 {'key1' : 'value1', 'key2' : 'value2'}와 같이 key와 value로 이루어져 있다. 처음에 set()을 생각을 못하고 list로 접근하여 풀어서... 당연..

article thumbnail
[python] 백준 1094번 막대기
알고리즘/백준 2021. 9. 16. 21:14

문제 요약 및 풀이 문제를 보자마자 아 그림으로 풀어야겠다 싶어서 그림으로 그려봤다. 순서는 ① -> ② -> ③ 순대로 보면 될 것 같다. 64를 반으로 나누면 32, 32 2개의 막대가 나오는데 하나의 막대는 버려야 하므로 절반으로 나누어 떨어질 때까지 문제에 있는 2가지 과정을 반복하다 보면 ②번과 같은 64 32 16 8 4 2 1 이 보여진다. 수 들의 공통점은 2^n 승이라는 것. 즉, 2진수로 표현이 가능하다. ③번과 같이 10진수로 입력을 받아 2진수로 변환을 해준후 1의 개수가 총 몇 개인지를 반환해주면 된다. 완성된 코드!!👍😊 print(bin(int(input()))[2:].count('1'))

article thumbnail
[python] 백준 1668번 트로피 진열
알고리즘/백준 2021. 9. 15. 01:28

문제 요약 및 풀이 간단하게 그림으로 그려서 보여드리겠습니다. 졸라맨 같은 사람은 문제에 나오는 민식이 입니다. 민식이가 선반을 왼쪽에서 보느냐 오른쪽에서 보느냐에 따라서 보이는 트로피의 개수가 다르기 때문에 이렇게 그림을 그려봤습니다. 선반을 오른쪽에서 왼쪽으로 바라봤다면 낮은 트로피부터 높은 트로피까지 총 5개가 보이는 것이고 반대로 선반을 왼쪽에서 오른쪽으로 바라봤다면 높은 트로피가 가장 먼저 보이게 되기 때문에 총 1개가 보이게 됩니다. 그 점을 생각하고 풀어주시면 됩니다. 완성된 코드!!👍😊 처음 코드 N = int(input()) h = [] max = -1 count = 0 for i in range(N): h.append(int(input())) if max < h[i]: max = h[i..

article thumbnail
[python] 백준 1075번 나누기
알고리즘/백준 2021. 9. 13. 23:28

문제 요약 및 풀이 N이 1000이고 F가 3일 때, N의 일의 자리, 십의 자리를 적절하게 제일 작게 바꿔서 바뀐 N을 F로 나누어 떨어지게 만들어야 한다. 바뀐 N은 1001이고 결과 출력 값은 02가 되는 것. 내가 생각한 풀이는 1. N을 입력받아서 일단 해당 일의 자리와 십의 자리를 00으로 바꿔줌 2. 바뀐 N을 int형으로 바꾸어서 F와 떨어지는지 확인 후 떨어지지 않는다면 1씩 누적시켜서 F와 떨어질 때까지 확인 3. 나누어 떨어진다면 해당 N의 십의자리와 일의 자리를 출력 3번은 슬라이싱으로 쉽게 표현할 수 있다. 아래의 표를 통해 N = 266, F가 9일 때의 결과를 출력해보겠다. N (입력) F (입력) 바뀐 N N % F N[-2:] (출력) 266 9 200 False 201 F..

article thumbnail
[python] 백준 1977번 완전제곱수
알고리즘/백준 2021. 9. 9. 23:34

문제 요약 및 풀이 완전제곱수. 64의 제곱근 8, 8을 제곱하게 되면 다시 64가 된다. 내가 생각한 풀이다. 제곱근을 구하고 정수형으로 타입 변환을 해준후에 다시 제곱하면 완전제곱수가 될 것이라고 생각했다. M N i = M int(i**0.5) T = int(i**0.5)**2 i == T sqrt_list 60 100 60 7 49 False 61 7 49 False 62 7 49 False 63 7 49 False 64 8 64 True 64 .... ... ... .... .... 100 10 100 True 64, 81, 100 표와 같이 결과가 나온다. 나머지는 M이상 N이하의 자연수 중에 완전제곱수가 없을 때에는 -1을 출력, 아니면 첫째줄에 합과 둘째 줄에 최솟값을 출력해주면 된다. 완..

article thumbnail
[python] 백준 1453번 피시방 알바
알고리즘/백준 2021. 9. 7. 23:35

문제 요약 및 풀이 피시방 자리는 1번부터 100번까지 있다. 처음에는 모두 비어있고, 들어오는 손님은 자기가 앉고 싶은 자리에만 앉고 싶어 한다. 해당 자리에 사람이 있으면 거절당한다. 거절당한 사람 수 출력 표로 정리해보았다. sit : 자리 번호 (1 ~ 100) N : 손님의 수 customer : 손님이 앉고 싶은 자리 cnt : 거절 당한 사람 수(누적) 1 5 1 0 2 2 0 3 3 0 4 2 1 5 3 2 ... 이미 1, 2, 3번 자리에는 자리가 있으니... 나중에 들어온 4번째, 5번째 손님이 앉고 싶은 자리 2번, 3번을 못 앉게 된다. 그럼 출력 결과는 2가 나오게 된다. 아래의 코드를 보면 sit의 배열의 크기를 미리 101개를 만들어두었다. 자리는 1~100까지 있지만 배열의..

article thumbnail
[python] 백준 1357번 뒤집힌 덧셈
알고리즘/백준 2021. 9. 6. 17:30

문제 요약 및 풀이 X, Y가 주어졌을 때, X, Y를 Reverse 시키고 합을 구한 후에 다시 Reverse를 시키면 된다. 처음에 문제를 제대로 읽지 않아... X, Y의 합을 구하고 Reverse를 시켰다. 틀려서 다시 대충 읽고 X, Y의 각각에 대해 Reverse를 시키고 합을 구했다. 또다시 틀려서 제대로 읽고 풀었다. 표로 작성을 해보면 아래와 같이 된다. X, Y를 입력받고 표의 오른쪽으로 진행이 된다고 볼 수 있다. X Y T = reverse(X) K = reverse(Y) T+K reverse(T+K) 123 100 321 1 322 223 그냥 간단하게 문자열의 슬라이싱과 리스트를 이용하여 돌렸다. 슬라이싱을 통해 reverse를 구현하였다. 완성된 코드!! 👍😊 s = input..

article thumbnail
[python] 백준 20362번 유니대전 퀴즈쇼
알고리즘/백준 2021. 9. 5. 02:34

문제 요약 및 풀이 N개의 채팅 기록 중에 정답자 S의 채팅 내용과 같은 채팅 내용들을 찾으면 된다. 내가 생각한 풀이는 이렇다. 1. 딕셔너리를 만들어서 dict[name] = chat 로 한 쌍을 이루어서 저장 2. 해당 dict[S]를 정답 answer에 대입하여 for문을 돌려 answer와 같은 채팅 내용을 가진 사람들을 카운팅 3. dict[S]가 아닌 사람들을 카운팅 해야 되기 때문에 if문으로 break 예제 입력 1을 예로 들면 N = 3, S = duck일 때 N name chat answer cnt 출력 1 oridya hello 2 orihehe hi hi 1 1 3 duck hi hi 2 표 이해가 안될 수도 있을 텐데... 그 부분은 풀이 1, 2, 3을 참조하면 될 것 같다. ..

article thumbnail
[python] 백준 11179번 2진수 뒤집기
알고리즘/백준 2021. 9. 2. 15:25

문제 요약 및 풀이 정수 N -> 13을 입력받아서 2진수로 바꾼 후 2진수를 뒤집어서 그거를 다시 정수로 만들면 된다. 예제 입력 1을 예로 보여주자면 N 2진수로 변환 2진수 reverse 바뀐 N 13 1101 1011 11 위의 표처럼 출력이 나오게 된다. 정수로 입력을 받는데 이진수로 받고, 0b~~~ 이런 식으로 나온 이진수의 앞의 '0b'를 제거해서 숫자만 나오도록 한다. 제거한 숫자(문자열)을 reverse로 순서를 뒤집어주고 0b를 다시 붙여준 후에 10진수로 만들어주면 된다. 아래와 같은 코드로 마무리 짓겠다. 완성된 코드!! 👍😊 s_N = bin(int(input())).replace("0b", "") arr_list = '0b'+''.join(list(reversed(s_N))) ..

article thumbnail
[python] 백준 4948번 베르트랑 공준
알고리즘/백준 2021. 9. 1. 22:00

해당 문제는 1929번의 소수 구하기 문제와 유사하므로 풀이 과정은 생략하겠다. [python] 백준 1929번 소수 구하기 문제 요약 및 풀이 M이상 N이하의 소수를 모두 출력 이 문제 같은 경우 1부터 ~ 1,000,000까지 소수인지 아닌지 일일이 검사한다면 시간 초과가 걸리게 될 것이다. 그렇기에 에라토스테네스의 체라 begin-dev-awos.tistory.com 코드!!👌👌 n = 123456*2 # 0, 1 = False, 소수는 2부터 시작이므로 True 로 설정 a = [False, False] + [True] * (n - 1) primes = [] for i in range(2, n + 1): if a[i]: primes.append(i) for j in range(2 * i, n + ..

article thumbnail
[python] 백준 1929번 소수 구하기
알고리즘/백준 2021. 8. 31. 21:53

문제 요약 및 풀이 M이상 N이하의 소수를 모두 출력 이 문제 같은 경우 1부터 ~ 1,000,000까지 소수인지 아닌지 일일이 검사한다면 시간 초과가 걸리게 될 것이다. 그렇기에 에라토스테네스의 체라는 알고리즘을 쓸 예정이다. 밑의 gif 파일을 보자. 이 gif 파일을 보면 2부터 120사이의 소수를 구하는데 2의 배수, 3의 배수... N의 배수를 검사하는 것을 볼 수 있다. 해당 배수들을 제거하게 되면 소수를 찾을 수 있다. '에라토스테네스의 체'의 시간복잡도는 O(Nlog(logN))이다. 일단 M과 N의 제한은 (1 ≤ M ≤ N ≤ 1,000,000) 이기 때문에 1부터 1,000,000까지의 소수를 미리 구해놓고 M과 N사이의 소수를 반환시켜줄 것이다. N의 배수를 제거해야 되기 때문에 b..

article thumbnail
[python] 백준 1158번 요세푸스 문제
알고리즘/백준 2021. 8. 28. 23:44

문제 요약 및 풀이 입력이 7 3일 때 (1 2 3 4 5 6 7) 번까지 총 7명의 사람이 원을 이루고 있게 되고 3번째 사람을 제거하게 되는데 표로 보여주겠다. 리스트를 이용해서 풀면 되겠다 싶었다. 배열의 index값은 0번째부터 시작이니 k=3이라면 list[2]라고 생각하면 된다. K번째 사람이 제거 될때마다 리스트의 사이즈가 하나씩 줄어드는 걸 볼 수 있다. 1 2 3 4 5 6 7 [0] [1] [2] [3] [4] [5] [6] 3 1 2 4 5 6 7 [0] [1] [2] [3] [4] [5] 6 1 2 4 5 7 [0] [1] [2] [3] [4] 2 1 4 5 7 [0] [1] [2] [3] 7 1 4 5 [0] [1] [2] 5 1 4 [0] [1] 1 4 [0] 4 빨간색만을 보면..