[WIL] 내일배움캠프 4주차..를 가장한 SWEA 문제풀이 모음집

히끼·2024년 3월 8일

WIL

목록 보기
4/6

이번주는 너무 정신이 없다.
내배캠에서 알고리즘 주차인데, 알고리즘 세계에 빠져서 그야말로 헤어나오지 못하고 있다.

그냥.. 정신 없이 알고리즘 짜다가 저장하는 걸 깜빡한 코드들.. 요기에 모아모아.. ㅎ

문자열 다루기

1215. 회문1 (초급)

for tc in range(1, 11):
    length = int(input())  # 찾아야 하는 회문의 길이 length
    rows = list(input() for i in range(8))  # 글자판 받기

    count = 0  # 찾은 회문 저장할 변수

    # 가로줄 탐색
    for row in rows:  # 줄 8개 돌기
        for r in range(9-length):
            text = row[r:r+length]
            text_reversed = text[::-1]
            count += (1 if text == text_reversed else 0)

    # 세로줄 탐색
    for col in range(8):
        col_text = ''.join([rows[r_idx][col] for r_idx in range(8)])  # 세로줄 기준으로 텍스트 만들기
        for c in range(9-length):
            text = col_text[c:c+length]
            text_reversed = text[::-1]
            count += (1 if text == text_reversed else 0)

    print(f"#{tc} {count}")

1989. 초심자의 회문 검사

T = int(input())
text_list = [input() for i in range(T)]

for text in text_list:
    is_palindrome = -1
    import math
    for i in range(math.ceil(len(text) / 2)):

        if text[i] != text[len(text) - 1 - i]:
            is_palindrome = 0
            break
        else:
            is_palindrome = 1

    print(f"#{text_list.index(text) + 1} {is_palindrome}")

10804. 문자열의 거울상

T = int(input())
test_cases = list(input() for t in range(T))

mirrored_text = {'b': 'd', 'd': 'b', 'p': 'q', 'q': 'p'} # 각 문자별로 거울문자 저장

for tc in test_cases:
    tc_list = list(tc)
    for i in range(len(tc_list)):
        tc_list[i] = mirrored_text[tc_list[i]]
    mirrored_tc = ''.join(tc_list)
    
    print(f"#{test_cases.index(tc) + 1} {mirrored_tc[::-1]}")

2007. 패턴 마디의 길이

T = int(input())
test_cases = list(input() for t in range(T))

for tc in test_cases:
    for i in range(1, len(tc)+1):
        pattern = tc[:i]
        post_pattern = tc[i:i*2]
        
        if pattern == post_pattern:
            pattern_length = len(pattern)
            break

    print(f"#{test_cases.index(tc) + 1} {pattern_length}")

1979. 어디에 단어가 들어갈 수 있을까

T = int(input())

for tc in range(T):
    n, k = map(int, input().split())  # n은 단어 퍼즐의 가로세로 길이, k는 단어의 길이
    puzzle = [list(map(int, input().split())) for n in range(n)]  # 단어 퍼즐
    answer = 0  # 정답 저장

    for i in range(n):
        count = 0
        # 가로줄 확인
        for j in range(n):
            if puzzle[i][j] == 1:  # 퍼즐이 1일 때
                count += 1
            if puzzle[i][j] == 0 or j == n-1:  # j==n-1 없으면, 마지막 칸에서 끝나는 경우를 셀 수 없음
                if count == k:  # 지금까지 쌓은 카운트가 단어 길이와 같다면 answer 올리기
                    answer += 1
                count = 0  # 다시 초기화

        # 세로줄 확인
        for j in range(n):
            if puzzle[j][i] == 1:
                count += 1
            if puzzle[j][i] == 0 or j == n-1:
                if count == k:
                    answer += 1
                count = 0

    print(f"#{tc+1} {answer}")

재귀함수

2817. 부분 수열의 합

def subsequence_sum(idx, sum):
    # 합이 k 값이 되는 경우의 수를 저장하기 위한 변수 (전역변수로 선언하여, 함수 종료 후에도 사라지지 않게 함)
    global count

    if idx >= n:  # 인덱스가 자연수 개수 이상이 되면 함수 종료
        return
    temp = sum + numbers[idx]
    if temp == k:
        count += 1

    subsequence_sum(idx + 1, temp)  # (현재 sum 값 + 이전 인덱스 값 + 새로운 인덱스 값)이 k 와 일치하는지 확인
    subsequence_sum(idx + 1, sum)   # (현재 sum 값 + 새로운 인덱스 값)이 k 와 일치하는지 확인


T = int(input())

for tc in range(T):
    n, k = map(int, input().split())  # n은 자연수 개수, k는 원하는 합
    numbers = list(map(int, input().split()))  # 자연수 리스트로 받기

    count = 0  # 각 케이스마다 0으로 초기화

    subsequence_sum(0, 0)  # 첫번째 0은 인덱스, 두번째 0은 합을 0으로 초기화하여 시작하는 것

    print(f"#{tc+1} {count}")

1217. 거듭 제곱

def power(base, exponent):
    if exponent < 1:
        return 1
    else:
        return base * power(base, exponent - 1)

for i in range(10):
    no = int(input())
    n, m = map(int, input().split())
    print(f"#{no} {power(n, m)}")

5215. 햄버거 다이어트

def hamburger(idx, score, cal):
    global max_score

    if cal > L: # 칼로리 초과
        return
    if score > max_score: # 현재 점수가 최대 점수보다 크면 저장
        max_score = score
    if idx == N: # 인덱스가 재료 수만큼 되면 종료
        return
    
    hamburger(idx + 1, score + ingredients[idx][0], cal + ingredients[idx][1]) # 현재 재료 선택
    hamburger(idx + 1, score, cal) # 현재 재료 미선택



T = int(input())  # 테스트 케이스 수

for tc in range(T):
    N, L = map(int, input().split())  # N은 재료의 수, L은 제한 칼로리
    ingredients = [list(map(int, input().split())) for n in range(N)] # [점수, 칼로리]

    max_score = 0
    hamburger(0, 0, 0)
    

    print(f"#{tc+1} {max_score}")

한주가 순식간에 지나가버렸다.
알고리즘은 하나 딱 해결하면 너무 신나는데,
그걸 해결하러 고민하는 과정이 굉장히 힘들고 머리도 아프고 기력이 쭉 빨린다.
그리고 하루종일 아무것도 안한 것 같은.. 성과가 없는 것 같아 슬프다. 😭

다음주는 더 어려워진다는데 큰일났다...

그나저나 이번 조는 너무 좋다.
이번엔 팀장이 되었는데, 팀원분들이 내가 하자는 걸 너무 잘 따라주셔서 하는 나도 신이 난다.
(물론 그분들이 좋아서 따라주는 건지, 걍 싫은데 따라주시는 건진 나도 잘 모르겠다.. ㅠ)

스쿼드 공부방에서도 반장이 되었는데, 칭찬을 많이 받아서,
알고리즘 하느라 힘든 와중에도 일주일 내내 기분 만큼은 좋았다. 😁

0개의 댓글