파이썬 70

[백준/알고리즘/python/java] 9375번 - 패션왕 신해빈

문제를 이해하면서, 파이썬의 딕셔너리 개념을 사용해야 한다고 생각했다. 딕셔너리는 기본적으로 중괄호({}) 를 사용해서 데이터를 묶는 형태를 띄며, 키(key)와 밸류(value)가 하나의 아이템(item)을 구성하게 된다. 즉, 딕셔너리에는 특정한 key값과 value 값이 서로 짝지어서 저장된다고 이해하면 편하다.(해쉬처럼 말이다.) 파이썬을 공부하면서 문제를 풀다 보니, 딕셔너리를 어떻게 사용해야 할지 감이 잘 안 왔다. 처음에 풀었던 코드는 아래와 같았다. (런타임 오류가 났었던 코드) testcase = int(input()) for test in range(testcase): n = int(input()) clothes = {} # clothes 라는 빈 딕셔너리 생성 for i in rang..

[백준/알고리즘/python/java] 13305번 - 주유소

전형적인 그리디 알고리즘 문제이다. 처음에는 계속 시간초과 문제를 해결하지 못했었다. 처음에 풀었던 코드는 이러했다. n = int(input()) roads = list(map(int, input().split())) prices = list(map(int, input().split())) total = prices[0] * roads[0] # 출발 도시의 기름가격 x 출발 도시와 두번째 도시 사이의 도로길이 previous_price = prices[0] # previous_price 에 우선 출발 도시의 가격 저장 # k 라는 변수를 1로 잡았다(두번째 도시와 세번째 도시 사이의 도로 길이 인덱스는 1 이므로) k = 1 # 도시 간격(도로 길이)를 나타내는 인덱스 for i in prices[1:..

[백준/알고리즘/python/java] 11399번 - ATM

최소값을 구하려면 우선, 시간을 오름차순으로 나열하는 것이 관건이다. 처음에는 map 함수를 통해서 여러개의 값을 받는 것을 list화 시켜서 정렬(sort)을 해야 하는데, 사용자에게 여러개의 값을 입력받을 때 number 값을 이용하는 줄 알고 애를 먹었다. 자바같은 언어에서는 보통 number 같은 변수를 입력 받아 for문을 돌면서 배열에 값을 넣어주기 때문이다. 하지만, 사용자에게 입력 받은 number는 나중에 값을 하나씩 더할 때 사용되는 것이고, 사용자에게 차례로 입력받은 값을 리스트에 넣으려면 그냥 map함수를 list() 해주면 됐다. 그리고 정렬을 할 때는 맨 처음에 애를 먹었던 것이 number = int(input()) time_list = map(int, input().split..

[백준/알고리즘/python/java] 11047번 - 동전 0

전형적인 그리디 알고리즘 문제이다. 주어진 금액을 만드는데 필요한 동전개수의 최소값을 구하는 것이므로, 주어진 금액에서 큰 금액을 빼가면서 개수를 구하면 최소 개수를 구할 수 있을 것이다. (맨 처음 풀었던 코드-시간초과) n, k = map(int, input().split()) coins = [] count = 0 for i in range(n): coins.append(int(input())) coins.reverse() standard = coins[0] for coin in coins: standard = coin if(k-standard = 0): k -= standard count += 1 print(count) 동전 리스..

[백준/알고리즘/python/java] 1978번 - 소수 찾기

소수 찾기는 기본 알고리즘을 공부할 때, 자주 접했던 문제이다. 사용자에게 개수를 입력받고 다음줄에 개수만큼 숫자들을 차례로 입력한다. 그 숫자들이 소수인지 소수가 아닌지 판별하기 위해서는 그 숫자를 2부터 그 숫자까지로 나눠봐야 알 수 있다. 그런데, 예를 들어 21 이라는 숫자를 가정해보자. 21의 약수는 1,3,7,21 이다. 지금의 경우에야 21을 3으로 나누면 나누어 떨어지므로 반복문을 돌 때 break 구문을 만나 탈출 할 것이다. 다른 문제에서는 이 숫자를 굳이 21까지 나눌 필요는 없다는 뜻이다. 어차피 약수는 서로 양끝의 숫자들이 차례로 쌍을 이루어 곱한 값이 그 수를 이룬다. 그렇다면, 해당 숫자의 제곱근 까지만 반복문을 돌아도 상관없어지게 된다. 이런 알고리즘은 약수의 개수가 몇 개인..

[백준/알고리즘/python/java] 2839번 - 설탕 배달

어떤 수가 주어질 때, 그 수가 5로 나누어 떨어지는 수 라면 5로 하나씩 빼고 3으로 나누어 떨어지는 수라면 3을 하나씩 빼면 될 것 같았다. 약간 그리디 알고리즘처럼 말이다. 하지만, 예외가 있었다. (처음 풀었던 python 코드) n = int(input()) cnt = 0 while(n != 0): if(n % 5 == 0): n -= 5 cnt += 1 elif(n % 3 == 0): n -= 3 cnt += 1 else: cnt = -1 break print(cnt) 하지만, 위 코드처럼 풀면, 8이라는 수는 2가 나와야 정상인데, -1을 출력하고 만다. 다시 고민해봤다. (두번 째로 고친 python 코드) n = int(input()) cnt = 0 while(n != 0): if(n %..

[백준/알고리즘/python/java] 2941번 - 크로아티아 알파벳

처음에는 시간초과가 났었던 문제이다. 알파벳을 기준으로 하지말고 기호를 기준으로 제어문을 나누었더니 시간초과문제가 해결되었다. (처음에 풀었던 코드-python) string = input() length = len(string) cnt = 0 idx = 0 while(idx != (length)): if(string[idx] == 'l'): if(string[idx+1] == 'j'): cnt += 1 idx += 2 else: cnt += 1 elif(string[idx] == 'n'): if(string[idx+1] == 'j'): cnt += 1 idx += 2 else: cnt += 1 idx += 1 elif(string[idx] == 'd'): if(string[idx+1] == 'z'): ..

[백준/알고리즘/python/java] 4673번 - 셀프 넘버

이전에 자바로 풀었던 문제를 파이썬을 공부하면서 다시 풀어봤다. 이런 유형의 문제는 일단 숫자를 다 써보면서 이해하는게 빠르다. 문제에서 말하는 셀프 넘버란 생성자가 없는 숫자를 말한다. (여기서 '생성자'란 어떠한 숫자를 만들 수 있는 숫자를 가리킨다.) 쉽게 예를 들어보자면, 1 : 1+1 = 2 를 만들 수 있다. (반면, 1은 어떠한 숫자로도 생성될 수 없다.)-> self_number(o) 2 : 2+2 = 4 를 만들 수 있다. ( 1로 2를 만들 수 있으므로 셀프넘버가 아니다.) -> self_number(x) 3 : 3+3 = 6 을 만들 수 있다. ( 반면, 3은 어떠한 숫자로도 생성될 수 없다.) -> self_number(o) 4 : 4+4 = 8 을 만들 수 있다. ( 2로 4를 만..

[백준/알고리즘/python/java] 1065번 - 한수

이전에 자바로 풀었던 문제를 파이썬을 공부하면서 다시 풀어보았다. 먼저 문제설명을 이해해보면, 100전까지의 모든 양수는 '한수'라는 것을 알 수 있다. 즉, 사용자가 입력한 수가 100보다 작은 수라면, 그대로 그 숫자가 '한수'의 개수이다. 그러면, 사용자가 100 이상의 숫자를 입력한다면, 100부터 사용자가 입력한 수까지 반복문을 돌면서 한수의 조건을 만족하는 등차수열의 공식을 그대로 적용하면 된다. 코드는 아래와 같다. def hansu(number): count = 99 # 100 전까지의 모든 자연수는 '한수'이기 때문에 초기변수를 99로 설정한다. if(number < 100): print(number) else: for i in range(100, number+1): x = str(i) ..

반응형