ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] 시작 & 구현 대비 문제 (feat.백준)
    카테고리 없음 2024. 6. 6. 11:47

    https://covenant.tistory.com/234

    문제는 백준사이트에서 풀었으며, 순서는 위 블로그 내용을 참고 하시길 바랍니다. 

    백준 2428번. 별 찍기 - 1

    [문제 풀기 전 생각한 부분]

    1. 받은 입력을 정수로 변환.

    2. for 문을 이용해서 출력. 

    [my_code]

    star = int(input())
    
    for i in range(1, star+1):
        print("*"*i)
        
    # 출력
    *
    **
    ***
    ****
    *****

    [다른 방법은 없을까?]

    리스트 컴프리헨션을 사용하고 싶어졌다. <-눌러질까?

    star = int(input())
    
    print(("*"*i) for i in range(star))
    
    # 출력
    <generator object simple_generator at 0x000001C0C50E4930>

    [문제점]

    1. print(("*"*i) for i in range(star)) : 제너레이터 객체(generator object)를 출력하는 과정에서 문제가 생긴 것. 
      • 제너레이터 객체란 무엇인지 알아보자.
         

        제너레이터 객체(generator object)는 파이썬에서 반복(iteration)을 제어하는 특별한 유형의 이터레이터(iterator)입니다. 제너레이터는 함수나 표현식을 통해 만들어지며, 호출될 때 값을 하나씩 반환하다가 마지막에 StopIteration 예외를 발생시킵니다. 제너레이터는 메모리 효율성이 높고, 필요할 때 값들을 하나씩 생성해내기 때문에 대용량 데이터 처리를 할 때 유용합니다.

         

        위 사실로 제너레이터 객체를 호출하여 반환하려면 하나씩 반환하거나 for문을 이용해서 반환해야 될 거 같은 생각이 든다. 

    def simple_generator():
        yield 1
        yield 2
        yield 3
    
    gen = simple_generator()
    print(next(gen))  # 출력: 1
    print(next(gen))  # 출력: 2
    print(next(gen))  # 출력: 3
    print(next(gen))  # StopIteration 예외 발생
    gen_exp = (x * x for x in range(3))
    print(next(gen_exp))  # 출력: 0
    print(next(gen_exp))  # 출력: 1
    print(next(gen_exp))  # 출력: 4
    print(next(gen_exp))  # StopIteration 예외 발생

    [문제점 해결]

    star = int(input())
    
    gen_exp = (("*" * i) for i in range(1, star + 1))
    
    for line in gen_exp:
        print(line)
        
    # 출력
    *
    **
    ***
    ****
    *****

    [결론]

    리스트컴프리헨션으로 구현하면 더 복잡해진다... 간단해질 줄 알았는 데,

    제너레이터 객체와 위 사실을 하나 배웠다. 

     

    별찍기2 부터 카이사르 암호 전까지 다 날라갔다......

    카이사르 암호부터 작성합니다. 

    백준 5,598번. 카이사르 암호

    [문제 풀기 전 생각한 부분]

    before = ['A','B','C','D','E','F','G','H','I','J','K'
              ,'L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
    
    # 리스트로 받은 이유 인덱싱을 활용하기 위해서
    
    after = 3
    # if before 25> 일 때는 -25 +3 = -22를 빼주자. 
    # print(before[25+ after])
    # ord 로 변환해서 X부터 A니깐 X - 숫자. 
    # 고도화) 여기서는 입력을 대문자로만 할 거지만, 소문자로 입력했을 때 -> 대문자로 변환해주는 작업. 
    
    # A = 65, X = 88, Y = 89, Z = 90 
    # 88 - 65 = 23이다. 
    word = input()
    #print(ord(word))
    
    # for 문으로 word의 길이 만큼 반복해서 찾아야지 
    # 예를 들어 ABC 를 입력 했으면 총 3번 반복하면서 각 문자를 ord로 바꿔주고 
    # 88 이상이면 -23를 뺀 뒤 append()를 이용해서 저장한 뒤 한 번 에 출력? 
    
    word_list = ""
    
    # str 형태로 word_list를 받는 이유 각각 저장되서 떨어지는 게 싫어서. 
    
    # for i in word:
    #     if ord(i) >= 88:
    #         print(chr(ord(i)-23))
    #     else:
    #         print(chr(ord(i)-3))
    
    # word_list -> str 타입으로 해서 append() 가 안 먹힘.
    # for i in word:
    #     if ord(i) >= 88:
    #         word_list.append(chr(ord(i)-23))
    #     else:
    #         word_list.append(chr(ord(i)-3))
    
    # print(word_list)
    
    # for i in word:
    #     if ord(i) >= 88:
    #         word_list = "".join(chr(ord(i)-23))
    #     else:
    #         word_list = "".join(chr(ord(i)-3))
    
    # print(word_list)
    
    
    # 처음엔 word_list 를 str타입으로 했지만 append() 내장함수를 사용 x
    # 따라서 word_list 를 list타입으로 변환한 뒤 append() 내장 함수를 사용하는 시도.
    
    # for i in word:
    #     if ord(i) >= 88:
    #         word_list.append(chr(ord(i)-23))
    #     else:
    #         word_list.append(chr(ord(i)-3))
    # print(word_list)
    
    
    # 근데 저장을 리스트 형태로 하나씩 하다 보니깐 내가 원하는 방식으로 안 나옴
    # 물론 replace라 던지 remove 라던지 하면 나오게 할 수 있을 거 같은 데 싫음. 
    
    # 다시 word_list 를 str타입으로 받고 시도
    # 잘 들어가지만 ABC 일 때 출력을 못한다.
    # A = 65, B = 66, C = 67, D = 68, U=85, V=86 ,W=87,X = 88, Y = 89, Z = 90 
    for i in word:
        if ord(i) <= 67:
            word_list += (chr(ord(i)+23))
        else:
            word_list += (chr(ord(i)-3))
    
    
    print(word_list)

    [정답 중 하나인 코드]

    word = input()
    word_list = ""
    for i in word:
        if ord(i) <= 67:
            word_list += (chr(ord(i)+23))
        else:
            word_list += (chr(ord(i)-3))
    
    print(word_list)

    [풀이]

    1. 사용자로부터 입력을 받는다. (여기서는 대문자 알파벳만 입력한다고 가정함.)

    (1-1,1-2 예외 생각해볼것..?)

    1-1. 그렇지 않고 소문자 알파벳 + 대문자 알파벳만 받는다면 내장함수 upper() 를 사용해서 변환환다.

    1-2. 만약 알파벳 이외의 문자도 받는다고 가정한다면, 그것 또한 예외처리가 필요할 것이다. 

    2. word_list 변수를 str 타입으로 초기화.

    2-1. str 타입으로 초기화 하는 이유는 각각 문자열을 for 문으로 돌려서 합쳤을 때, 문제에서 원하는 대로 출력해주기 위해서이다. 만약에 list 타입으로 했다면 나중에 출력될 때, ['A', 'B', 'C'] <- 요런식으로 출력되기 때문이다. 

    3. word의 길이 만큼 for문을 반복할 것이고, i 안에는 word에 포함된 알파벳이 순회할 것이다. 

    4. 최종 결과인 word_list를 출력한다. 

     

    백준 2,562번. 최댓값

    [문제 풀기 전 생각한 부분]

    1. 9줄에 걸쳐서 입력을 받아야 되니 for문을 사용하자.

    2. 입력 받은 걸 저장할 공간을 만들되 리스트로 하자. 그 이유는 내장함수 append()를 사용할 것이기 때문에,

    2-1. 튜플이나 다른 걸로 해도 상관은 없을 듯, 변할 일은 없으니깐,..?

    3. 내장함수 index를 어떻게 사용했는 지 기억이 나지 않아서 for문과 if 문을 사용해서 최댓값의 위치를 잡았다.

    [my_code]

    num = []
    
    for _ in range(9):
        n = int(input())
        num.append(n)
    
    print(max(num))
    
    for i in range(9):
        if num[i] == max(num):
            print(i+1)

    [풀이]

    사용자로부터 입력을 받아 9개의 숫자 중 최댓값과 최댓값이 몇 번째 위치하고 있는 지 출력하는 프로그램입니다.

    num = [] - n이 들어올 공간을 초기화 합니다.

    for _ in range(9) : 9번 반복 하면서 사용자로부터 입력을 받아 정수형으로 변환합니다. 

    num.append(n) : 사용자로부터 받은 입력값을 num에 저장합니다. 

    print(max(num)) : num의 최댓값을 출력합니다.

     

    for i in range(9) : 9번 반복하며 num[i] 의 값이 최댓값일 때, 

    print(i+1) : 최댓값의 위치를 출력합니다. 

    [index내장함수를 사용한 풀이]

    num = []
    
    for _ in range(9):
        n = int(input())
        num.append(n)
    
    index = num.index(max(num))
    print(max(num))
    print(index+1)

    백준 10,872번. 팩토리얼

    [문제 풀기 전 생각한 부분]

    1. 느낌적으로 if 문을 사용해서 0일 때랑 아닐때를 구별해야겠다는 생각이 들었음.

    2. for문을 돌려서 숫자는 오름차순으로 증가할 수 있는 데 어떻게 곱하지

    [my_code]

    n = int(input())
    mult = 1
    
    if n == 0:
        print(1)
    else:
        for i in range(1,n+1):
            mult *= i
        print(mult)

    [풀이]

    이 프로그램은 입력된 정수 n의 팩토리얼을 계산하는 코드입니다. 팩토리얼은 1부터 n 까지의 모든 정수를 곱한 값으로 정의됩니다. 

    1. 입력 받기 : n = int(input())

    사용자의 입력값을 정수형으로 변환하여 변수 n에 저장합니다.

     

    2. 초기값 설정 : mult = 1

    팩토리얼 계산을 위해 변수를 초기화합니다. 

     

    3.  특별한 경우 처리 if n==0:

    만약 입력값이 0이라면 팩토리얼 값을 1이므로 1을 출력하고 프로그램을 종료합니다.

     

    4. 반복문을 통한 팩토리얼 계산

    각 반복문에서 mult *= i는 mult에 현재 값 i를 곱하여 저장합니다.

     

    5. 결과 출력 print(mult)

     

    백준 1,037번. 약수

    [문제 풀기 전 생각한 부분]

    # A가 N의 약수라면 
    # A 는 1과 N이 되어선 안된다? 왜 1은 되도 되지 않나 무튼,
    # A의 갯수가 2를 초과할 때, 제일 작은 숫자와 큰 숫자를 곱하면 N이 된다. 
    # 2를 초과하지 않아도, 제일 작은 숫자와 큰 숫자를 곱하면 N이 되지.
    
    # 여기서 약수의 갯수가 의미가 있나? 
    # 약수의 갯수로 입력이나 받자.
    
    A = int(input())
    
    N = list(map(int, input().split()))
    
    # for i in range(A):
    #     N.append((int(input())))
    
    print(max(N) * min(N))

    백준 2,576번. 홀수

    [문제 풀기 전 생각한 부분]

    # 우선 7개의 자연수가 총 7줄에 걸쳐서 주어진다.
    # for 문을 이용해서 7번 입력 받자.
    # 빈 리스트를 이용해서 거기에 저장을 하고 (다 저장할 필요없이 않나?) 
    # if문을 이용해서 짝/홀수 구별.
    # 저장된 리스트의 합 for문으로 구하고 range(len.리스트)
    # if 리스트[i] == min[리스트] 도 출력해주자. 
    # 마지막으로 7개의 숫자가 다 짝수일 경우 -1을 출력한다.
    
    odd_num = []
    
    for _ in range(7):
        num = int(input())
        if num % 2 == 1:
            odd_num.append(num)
    
    # print(odd_num)
    
    sum = 0
    
    if odd_num == []:
        print(-1)
    else:
        for i in odd_num:
            sum += i
        print(sum)
        print(min(odd_num))

    백준 1,546번. 평균

    [문제 풀기 전 생각한 부분]

    # 처음 입력한 숫자만큼 반복 for 문을 사용
    # 시험 본 점수를 한 곳에 저장을 해야되나? 저장을 한 뒤
    # 가장 큰 숫자를 고르고, for문을 이용해서 나누고(점수/최고점수) *100 / 과목수(처음입력한숫자)
    
    N = int(input())
    
    score = list(map(int,input().split()))
    
    m = 0 
    
    for i in range(N):
        m += (score[i] / max(score) * 100)
    
    m /= N
    
    print(m)
Designed by Tistory.