알고리즘 공부/BOJ백준 풀이

    [백준 1316번-파이썬/Python] 그룹 단어 체커

    http://acmicpc.net/problem/1316 {코드} ans = 0 for _ in range(int(input())): word = input() new_word = '' isTrue = True for c in word: i, j = word.find(c), word.rfind(c) if word.count(c) != j-i+1: isTrue = False break ans += isTrue print(ans) {설명} *True는 숫자 1의 값을, False는 숫자 0의 값을 가지고 있습니다. 위 방법은 어떤 문자에 대해 그 문자의 처음과 마지막 위치를 통해 문자들이 연결되어 있는지 아닌지 확인합니다. 예시를 들어 설명해보겠습니다. -그룹 문자인 예 word라는 변수가 있고 'hhaap..

    [백준 2941번-파이썬/Python] 크로아티아 알파벳

    http://acmicpc.net/problem/2941 {코드} croatian_alphabets = ['c=', 'c-', 'dz=', 'd-', 'lj', 'nj', 's=', 'z='] word = input() for c_alphabet in croatian_alphabets: word = word.replace(c_alphabet, ' ') print(len(word)) {설명} 문제는 크로아티아 알파벳의 개수를 출력하라고 요구하므로 크로아티아 알파벳의 특이 문자들을 아무 문자 하나로 각각 바꿔주고 그 길이를 출력하면 됩니다. *문자열의 replace함수는 replace(선택할 문자열, 바꿀 문자열, 개수=옵션)의 형태로 되어 있으며 바꾼 문자열을 반환한다.

    [백준 5622번-파이썬/Python] 다이얼

    http://acmicpc.net/problem/5622 {코드} classify = ['ABC', 'DEF', 'GHI', 'JKL', 'MNO', 'PQRS', 'TUV', 'WXYZ'] s = input() ans = 0 for c in s: for idx, dial in enumerate(classify): if c in dial: ans += 3 + idx break print(ans) {설명} 다음 표를 보면 알파벳을 문제의 다이얼과 같이 구분해서 리스트로 만들었을 때 인덱스와 걸리는 시간과의 관계를 알 수 있다. 알파벳 걸리는 시간 인덱스 구분 ABC 3 0 0 + 3 DEF 4 1 1 + 3 GHI 5 2 2 + 3 JKL 6 3 3 + 3 MNO 7 4 4 + 3 PQRS 8 5 5 + ..

    [백준 2908번-파이썬/Python] 상수

    http://acmicpc.net/problem/2908 {코드} nums = map(int, map(lambda s: s[::-1], input().split())) print(max(nums)) {설명} 이 문제는 map함수와 문자열 슬라이싱을 통해 쉽게 풀 수 있습니다. 두 번째 map부터 살펴보면 람다 함수를 이용해 문자열을 뒤집는 코드입니다. 그 후 첫 번째 map이 각 뒤집은 문자열들을 숫자로 변환시킵니다. 그 후 최댓값을 출력하면 됩니다. {코드} nums = list(map(lambda s: s[::-1], input().split())) print(nums[0] if eval('>'.join(nums)) else nums[1]) {설명} 위의 코드는 eval함수를 사용한 것인데 제 이전 ..

    [백준 1152번-파이썬/Python] 단어의 개수

    http://acmicpc.net/problem/1152 {코드} print(len(input().split())) {설명} 이 문제는 굉장히 쉽게 풀 수 있는 문제이다. split함수는 인자로 주어진 문자열을 기준으로 어떤 문자열을 나누는 함수로서 나눈 리스트를 반환하고 기본적으로 공백을 기준으로 한다. 즉, "Hello World"라는 문자열에 split()을 실행하면 ["Hello", 'World"]의 리스트를 반환한다. 여기에 len함수를 사용하면 개수를 알 수 있으므로 아래와 같이 코드를 짜면 된다.

    [백준 1157번-파이썬/Python] 단어공부

    http://acmicpc.net/problem/1157 {코드} words = input().upper() word_list = list(set(words)) word_count = [words.count(c) for c in word_list] if(word_count.count(max(word_count)) > 1): print('?') else: print(word_list[(word_count.index(max(word_count)))]) {설명} 이 문제를 푸는 하나의 방법은 각 문자 별로(대소문자 구분 없이) 개수를 저장해서 만약 최댓값이 2개 이상이라면?를 출력하고 아니라면 최댓값을 가진 문자를 출력하면 됩니다. 이를 위해 집합과 count함수를 사용합니다. 먼저 문자열을 입력받고 대문자로..

    [백준 2675번-파이썬/Python] 문자열 반복

    http://acmicpc.net/problem/2675 {코드} for _ in range(int(input())): n, s = input().split() n = int(n) print(''.join([c*n for c in s])) {설명} 파이썬에서는 문자열*숫자를 통해 문자열을 간단히 반복할 수 있습니다. 코드를 보면 숫자 n과 문자열 s가 존재하고 s의 각 인덱스에 n을 곱한 문자열을 리스트로 저장하고 이를 join함수를 통해 합쳐 출력하고 있습니다.

    [백준 10809번-파이썬/Python] 알파벳 찾기

    http://acmicpc.net/problem/10809 {코드} word = input() alphabet = dict() for c in map(chr, range(97, 123)): alphabet[c] = -1 for i, c in enumerate(word): if alphabet[c] == -1: alphabet[c] = i print(*alphabet.values()) {설명} 이 문제는 딕셔너리 자료형을 쓸 수 있는 전형적인 문제라고 생각합니다. 먼저, 딕셔너리를 알파벳 소문자들을 각각 키(key)로 놓고 모든 키에 대한 값을 -1로 초기화시킵니다. 그 후, 입력받은 문자열을 enumerate함수를 통해 반복문을 돌려 만약 어떤 문자에 대한 딕셔너리 값이 -1이라면 업데이트하고 아니면 무..

    [백준 11720번-파이썬/Python] 숫자의 합

    http://acmicpc.net/problem/11720 {코드} input() print(sum(map(int, input()))) {설명} 이 문제는 각 자릿수의 합을 구하는 문제로 map함수와 sum함수를 통해 쉽게 풀 수 있습니다. *map함수의 두 번째 인자는 이터러블(iterable)로 문자열, 리스트, range 등이 해당한다.

    [백준 11654번-파이썬/Python] 아스키코드

    http://acmicpc.net/problem/11654 {코드} print(ord(input())) {설명} 먼저 아스키코드에 대한 설명을 하자면 아스키코드란 미국정보보환표준부호의 약자로 그냥 128개의 문자라고 보면 됩니다. 이 128개의 문자안에는 A~Z, a~z, 0~9, 그리고 각종 특수 문자가 포함되어 있고 쉽게 보면 영문 키보드라고 보셔도 됩니다. 이 128개의 문자는 한 바이트(8비트)로 만들어지며 한 개의 에러 확인용 비트를 제외한 7개의 비트로 구현되어 있습니다. 즉, 각각의 문자는 그에 상응하는 숫자를 가지고 있다는 뜻입니다. 더 자세한 내용은 이 블로그를 봐주시기 바랍니다.(설명을 잘 해놓으셨어요!) 그래서 아스키코드를 가져오려면 파이썬의 ord라는 함수를 사용하면 쉽게 가져올 수..