[SWEA] (D1~D2 문제풀이) 기초 다지기 Part2

CHAEN·2022년 7월 1일
0

problem solving

목록 보기
25/33
post-thumbnail

D2. 2007번 - 패턴 마디의 길이

나의 풀이

T = int(input())

for test_case in range(1, T + 1):
    string = input()
    pattern_len = 0

    for i in range(1, len(string)):
        if string[:i] == string[i:2*i]:
            pattern_len = i
            break

    print(f'#{test_case} {pattern_len}')

문제를 잘 읽자!!
처음에는 전체 문자열에 패턴이 몇 개 들어가는지 구하는 문제인줄 알고 계속 전체 길이에서 나누다가 뒤늦게 패턴 자체의 길이를 구하는 문제라는 걸 알게됐다;;

D2. 1989번 - 초심자의 회문 검사

나의 풀이

T = int(input())

for test_case in range(1, T + 1):
    string = input()
    check = 0
    
    if string == string[::-1]:
        check = 1
    else:
        check = 0
        
    print(f'#{test_case} {check}')

파이썬이라 쉽게 풀 수 있었던 문제 같다.

D2. 1984번 - 중간 평균값 구하기

나의 풀이

import statistics

T = int(input())

for test_case in range(1, T + 1):
    nums = list(map(int, input().split()))
    nums.remove(max(nums))
    nums.remove(min(nums))
    
    print(f'#{test_case} {int(round(statistics.mean(nums), 0))}')

문제 조건 따라서 마지막 int로 변환하는거 까먹지 말기!!

D2. 1983번 - 조교의 성적 매기기

나의 풀이

T = int(input())

grades = ['A+', 'A0', 'A-', 'B+', 'B0', 'B-', 'C+', 'C0', 'C-', 'D0']

for test_case in range(1, T + 1):
    n, k = map(int, input().split())
    students = []
    k_score = 0
    for i in range (1, n+1):
        scores = list(map(int, input().split()))
        score = 0.35 * scores[0] + 0.45 * scores[1] + 0.2 * scores[2]
        if i == k:
            k_score = score
        students.append(score)
    students = sorted(students, reverse=True)
    
    rank = students.index(k_score)
    grade = rank // (n//10)
    print(f'#{test_case} {grades[grade]}')

맞기는 했지만 어쩐지 더 깔끔하게 푸는 방법이 있을 것만 같다.
내가 풀었지만 상당히 마음에 안드는 풀이..

D2. 1976번 - 시각 덧셈

나의 풀이

T = int(input())

for test_case in range(1, T + 1):
    h1, m1, h2, m2 = map(int, input().split())
    h = h1 + h2
    m = m1 + m2
    
    if m > 60:
        m -= 60
        h += 1
    if h > 12:
        h -= 12
    print(f'#{test_case} {h} {m}')

시, 분 넘어가는 것만 신경쓰면 된다.

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

나의 풀이

T = int(input())

for test_case in range(1, T + 1):
    n, k = map(int, input().split())
    puzzle = [list(map(int, input().split())) for _ in range(n)]
    count = 0
    #가로 검사
    for i in range(n):
        part = puzzle[i]
        check = 0
        for cell in part:
            if cell:
                check += 1
            else:
                if check == k:
                    count += 1
                check = 0
        if check == k:
            count += 1
          
    #세로 검사
    for i in range(n):
        part = [puzzle[x][i] for x in range(n)]
        check = 0
        for cell in part:
            if cell:
                check += 1
            else:
                if check == k:
                    count += 1
                check = 0
        if check == k:
            count += 1
            
    print(f'#{test_case} {count}')

처음에는 퍼즐을 단어의 크기대로 잘라놓고 검사를 했는데 이렇게 하니 단어의 길이보다 더 큰 칸도 단어가 들어갈 수 있다고 체크하게 된다.
단어의 길이와 정확하게 일치하는 칸의 개수만 찾아야 하는 문제!

D2. 1974번 - 스도쿠 검증

나의 풀이

T = int(input())

for test_case in range(1, T + 1):
    sudoku = [list(map(int, input().split())) for _ in range(9)]
    answer = 1
    # 가로 검사
    for i in range(9):
        row = set(sudoku[i])
        if len(row) != 9:
            answer = 0
            break
    # 세로 검사
    for i in range(9):
        col = set( [sudoku[x][i] for x in range(9)])
        if len(col) != 9:
            answer = 0
            break
    # 블럭 검사
    for i in range(3):
        row = sudoku[i*3:(i+1)*3]
        for j in range(3):
            block = []
            for r in row:
                block += r[j*3:(j+1)*3]
            if len(set(block)) != 9:
                answer = 0
                break
    print(f'#{test_case} {answer}')

set를 이용해 겹치는 원소가 있는지 확인해주었다.
행과 열을 검사하는 부분은 쉽게 해결했는데 블럭을 검사하는 부분에서 반복문을 꼭 3개를 써야하는가.. 때문에 많은 고민을 했다.
어차피 주어진 문제에서는 각 반복의 수가 3을 넘지 않기 때문에 그냥 삼중 반복을 사용하였다.

D2. 1970번 - 쉬운 거스름돈

나의 풀이

T = int(input())

moneys = [50000, 10000, 5000, 1000, 500, 100, 50, 10]

for test_case in range(1, T + 1):
    money = int(input())
    change = ''
    for m in moneys:
        change = change + ' ' + str(money // m)
        money %= m
    print(f'#{test_case}')
    print(change[1:])

문제는 쉬웠지만 출력 형식을 안맞춰서 2번이나 틀렸다.
문제를 잘 읽자...!!

profile
공부중입니다

0개의 댓글

관련 채용 정보