ComputerScience/Algorithm
-
[BOJ] 두 수 비교하기 - 1330ComputerScience/Algorithm 2024. 9. 11. 14:49
문제문제 설명두 정수 A와 B가 주어졌을 때, A와 B를 비교하는 프로그램을 작성하시오.입력첫째 줄에 A와 B가 주어진다. A와 B는 공백 한 칸으로 구분되어져 있다.출력첫째 줄에 다음 세 가지 중 하나를 출력한다.A가 B보다 큰 경우에는 '>'를 출력한다.A가 B보다 작은 경우에는 ''를 출력한다.A와 B가 같은 경우에는 '=='를 출력한다.성능 요약메모리: 31120 KB, 시간: 32 ms분류구현접근 방법입력을 받고, 리스트 인덱싱을 통해 대소를 비교하는 방식을 선택하였다.import sys input = sys.stdin.readline arr = list(map(int, input().split())) if arr\[0\] > arr\[1\]: print('>') elif arr\[..
-
[LeetCode] 367. Valid Perfect ScoreComputerScience/Algorithm 2024. 4. 9. 15:23
문제성능 요약메모리: 16.52MB , 시간: 41ms 접근 방법일단 라이브러리를 사용할 수 없다는 문제 조건으로 시간 복잡도를 어떻게 줄여 나갈 것인가가 관건이라고 생각했다.제곱근은 주어진 num의 절반보다 작을 것이다.예를 들어 16의 제곱근인 4는 16의 절반보다 작다. 또한 제곱근끼리의 곱셈이 num보다 커진다면 그것은 제곱수가 아니라고 판단했다.예를 들어 15의 경우 1~8까지 탐색을 하는데, i가 4일 경우 16이 되어 15를 넘어가게 되므로 이는 15가 제곱근으로 정수를 갖지 않는다는 것과 같다고 생각했다.정답class Solution: def isPerfectSquare(self, num: int) -> bool: if num == 1: retu..
-
[LeetCode] 166. Fraction to Recurring DecimalComputerScience/Algorithm 2024. 4. 9. 15:13
문제 성능 요약 메모리: 16.9MB, 시간: 26ms 분류 ? 접근 방법 리트코드로 문제를 푸는 것이 처음이어서, class를 활용한 디버깅 방법 등을 연구하느라 시간이 좀 걸렸다. 문제로에서는 분수가 반복되는 부분을 찾는 것이 관건이겠다 생각했다. class Solution: def fractionToDecimal(self, numerator: int, denominator: int) -> str: ans = "" ans2 = "" n = numerator d = denominator if n % d == 0: return str(n//d) else: if len(str(n/d)) > 10: ans += str(n/d).split(".")[1] for i in ans: if i in ans2: bre..
-
[BOJ] 히든 넘버 - 8595ComputerScience/Algorithm 2024. 4. 9. 00:44
문제성능 요약메모리: 40192KB, 시간: 2336ms분류문자열파싱접근 방법주어진 단어들 사이에서 조건에 맞는 '숫자'들의 합을 구하는 문제였기 때문에, 문자열에서 숫자와 문자를 구분하는 법부터 알아야 된다고 생각했다. 하다 보니 매우 하드코딩이 된 것 같다.먼저 주어진 단어를 인덱스 하나씩 탐색하여 문자열의 아스키코드를 이용하는 ord()함수를 사용해서 문자인 것과 아닌 것의 처리를 다르게 할 수 있도록 분기를 나눴다.인덱스가 늘어나면서 숫자이면 number 문자열에 +연산으로 더하였고, 아니라면(즉 문자라면) 이때까지 더해서 나온 단어를 int()로 숫자화하여 결과값을 출력하기 위한 sum에 더해주었다.하지만 여기서 예외 케이스들이 몇개 있었다. 예를 들자면 'aaaaa0a009'와 같은 케이스였다..
-
[BOJ] 8진수, 10진수, 16진수 - 11816ComputerScience/Algorithm 2024. 4. 6. 14:24
문제https://www.acmicpc.net/problem/11816성능 요약메모리: 31252 KB, 시간: 40 ms분류사칙연산구현수학파싱문자열접근 방법주어진 조건에 맞게 분기를 나누었다.8진수는 0부터 시작하고, 16진수는 0x로 시작한다. 이에 맞게 주어진 입력을 처리하면 되었고, 문자열은 슬라이싱이 가능하기 때문에 이를 활용하였다. 잘 모르고 있었던 것은 8진수, 16진수로의 변환과 int()의 사용법이었다.정답import sysinput = sys.stdin.readlinex = input().rstrip()if len(x) >= 2: if (x[0] == "0") & (x[1] == "x"): print(int(x[2:], 16)) elif x[0] == "0": ..
-
[BOJ] 숫자의 합 - 11720ComputerScience/Algorithm 2024. 4. 5. 14:27
문제 성능 요약메모리: 31120 KB, 시간: 44 ms분류구현수학문자열접근 방법일렬로 들어오는, 구분자가 없는 문자열을 어떻게 처리할지 고민했다.split() 함수를 사용할 수 있었다. 하지만 split()은 공백, 쉽표 등의 구분자가 존재해야만 했고 이를 사용할 수 없다는 것을 알게 되었다.공백이 없는 문자열을 자르기 위해서는 list()를 사용할 수 있었다. 하지만 list()는 input()으로 들어온 모든 문자열을 문자 하나씩 원소화한다. 따라서 '\n'과 같은 개행문자도 원소에 포함한다.이를 위해서 rstrip()을 활용해 '\n'을 제거하였다.정답import sysinput = sys.stdin.readlinen = int(input())b = list(map(int, list(input(..
-
[BOJ] 소인수분해 - 11653ComputerScience/Algorithm 2024. 4. 5. 10:58
문제 접근 방법부끄럽지만 일단 소인수 분해에 대해 다시 찾아봤다..소인수분해란, 어떤 자연수를 소인수(소수인 인수)들의 곱으로 나타내는 것이다. 그렇다면 '소수'란 무엇인가?소수는 1과 자기 자신만을 인수로 갖는 수를 말한다. 그렇다면 우리가 구해야 할 것은 '소수'라고 생각해서, 나눠주는 과정 속에서 그 다음 소수로 나눠주고, 안나눠지면 또 다른 소수를 나눠주면 되겠다 생각했다.while n == i: if n % i != 0 : n = n // i; print(i) else: i += 1 if i % 2 == 0: i += 1 다음과 같이 접근하여, 자연수를 소수를 인수분해 하면 n이 인수가 될 때 까지 반복하면 끝난다..