본문 바로가기
Study with Yedol/코딩테스트 준비

[python3] SWEA D2 문제풀이 | 1976. 시각 덧셈 외 7문제

by 예돌맨 2024. 5. 18.
반응형

 

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

N X N 크기의 단어 퍼즐을 만들려고 한다. 입력으로 단어 퍼즐의 모양이 주어진다.
주어진 퍼즐 모양에서 특정 길이 K를 갖는 단어가 들어갈 수 있는 자리의 수를 출력하는 프로그램을 작성하라.

t = int(input())

for tc in range(1, t+1):
    n, k = map(int, input().split())
    # 퍼즐 모양을 2차원 배열로 입력받음
    arr = [list(map(int, input().split())) for _ in range(n)]
    result = 0

    # 퍼즐의 각 행을 검사
    for i in range(n):
        sum = 0 # 연속된 1의 개수를 세기 위한 변수 초기화

        # 가로
        for j in range(n):
            if arr[i][j] == 1:
                sum += 1 # 연속된 1의 개수 증가
            if arr[i][j] == 0 or j == n - 1:
                # 연속된 1의 개수가 k와 같으면 단어갈 들어갈 수 있는 자리로 간주
                if sum == k:
                    result += 1
                # 연속된 1의 개수 초기화
                sum = 0

    # 세로(열)을 검사
    for i in range(n):
        sum = 0

        # 세로
        for j in range(n):
            if arr[j][i] == 1:
                sum += 1
            if arr[j][i] == 0 or j == n - 1:
                # 연속된 1의 개수가 k와 같으면 단어가 들어갈 수 있는 자리로 간주
                if sum == k:
                    result += 1
                #연속된 1의 개수 초기화
                sum = 0

    print('#{} {}'.format(tc, result))

 

#1976. 시각 덧셈

시 분으로 이루어진 시각을 2개 입력 받아, 더한 값을 시 분으로 출력하는 프로그램을 작성하라.
(시각은 12시간제로 표시한다. 즉, 시가 가질 수 있는 값은 1시부터 12시이다.)

 

풀이1) 경우의 수 나눠서 계산

T = int(input())

for tc in range(1, T+1):
    f_hour, f_min, s_hour, s_min = map(int,input().split())

    sum_min = f_min + s_min
    sum_hour = f_hour + s_hour

    #조건1 : 60분 이상, 13시 이상
    if sum_min >= 60 and sum_hour >= 13:
        sum_hour -= 11 # +1-12
        sum_min -= 60
        print('#{} {} {}'.format(tc, sum_hour, sum_min))
    #조건2 : 60분 이상, 13시 미만
    elif sum_min >= 60 and sum_hour < 13:
        sum_hour += 1
        sum_min -= 60
        print('#{} {} {}'.format(tc, sum_hour, sum_min))
    #조건3 : 60분 미만, 13시 이상
    elif sum_min < 60 and sum_hour >= 13:
        sum_hour -= 12
        print('#{} {} {}'.format(tc, sum_hour, sum_min))
    #조건4 : 60분 미만, 13시 미만
    else:
        print('#{} {} {}'.format(tc, sum_hour, sum_min))

 

풀이2) 몫과 나머지로 계산

T = int(input())

for tc in range(1, T+1):
    f_hour, f_min, s_hour, s_min = map(int,input().split())

    sum_min = f_min + s_min
    sum_hour = f_hour + s_hour + (sum_min // 60)
    sum_min = sum_min % 60

    if sum_hour > 12:
        sum_hour -= 12
    print('#{} {} {}'.format(tc, sum_hour, sum_min))

 

 

#1974. 스도쿠 검증

스도쿠는 숫자퍼즐로, 가로 9칸 세로 9칸으로 이루어져 있는 표에 1 부터 9 까지의 숫자를 채워넣는 퍼즐이다.

같은 줄에 1 에서 9 까지의 숫자를 한번씩만 넣고, 3 x 3 크기의 작은 격자 또한, 1 에서 9 까지의 숫자가 겹치지 않아야 한다.

입력으로 9 X 9 크기의 스도쿠 퍼즐의 숫자들이 주어졌을 때, 위와 같이 겹치는 숫자가 없을 경우, 1을 정답으로 출력하고 그렇지 않을 경우 0 을 출력한다.

아이디어 : 처음에 1~9까지의 숫자 합이 45인거를 이용하여 문제를 풀었지만, 3*3의 유효성을 검사하기에는 어려움을 겪어서 (테스트 케이스 5개 맞음ㅠ) 다른 사람 코드를 보고 풀어보았다.

T = int(input())

for tc in range(1, T+1):
    # 9*9 크기의 스도쿠 퍼즐을 입력받음
    arr = [list(map(int,input().split())) for _ in range(9)]
    # 유효성 검사 ( 1: 유효, 0: 유효X)
    result = 1

    # 가로, 세로 검사
    for i in range(9):
        cnt_row = [0] * 10 #행 카운트 리스트
        cnt_col = [0] * 10 #행 카운트 리스트
        for j in range(9):
            cnt_row[arr[i][j]] += 1 #행 숫자 카운트
            cnt_col[arr[j][i]] += 1 #열 숫자 카운트

        # 중복 체크
        for x in range(1,10): # 1부터 9까지의 숫자에 대해 검사
            if cnt_row[x] != 1: #행에서 중복된 숫자가 있는 경우
                result = 0
                break
            if cnt_col[x] != 1: #열에서 중복된 숫자가 있는 경우
                result = 0
                break

    # 3*3 격자 검사
    for i in range(3): #3*3 격자의 행 시작점(0,3,6)
        for j in range(3): #3*3 격자의 열 시작점(0,3,6_
            cnt_x = [0] * 10 # 3*3격자의 숫자 카운트를 위한 리스트
            for x in range(3): # 3*3 격자의 행 인덱스(0,1,2)
                for y in range(3): # 3*3 격자의 열 인덱스(0,1,2)
                    cnt_x[arr[3*i+x][3*j+y]] += 1 #3*3 격자의 숫자 카운트 증가

            for x in range(1,10): #1부터 9까지의 숫자에 대해 검사
                if cnt_x[x] != 1: # 3*3격자에 숫자가 한 번만 등장하지 않으면
                    result = 0 # 유효하지 않음으로 설정
                    break

    # 결과 출력
    print('#{} {}'.format(tc, result))

 

 

#1970. 쉬운 거스름돈

S마켓에서 손님에게 거슬러 주어야 할 금액 N이 입력되면 돈의 최소 개수로 거슬러 주기 위하여 각 종류의 돈이 몇 개씩 필요한지 출력하라.

아이디어 : 리스트에 각 거스름돈 카운트를 저장하여 출력한다.

T = int(input())
coin_types = [50000,10000,5000,1000,500,100,50,10]

for tc in range(1, T+1):
    n = int(input())
    result = [] # 결과를 저장할 리스트 초기화

    # 각 화폐 단위에 대해 필요한 개수 계산
    for coin in coin_types:
        count = n // coin
        result.append(count)
        n %= coin

    print('#{}'.format(tc))
    for i in result:
        print(i, end=' ')
    print() # 결과 출력 후 다음줄에 n을 입력 받음

 

#1966.  숫자를 정렬하자

주어진 N 길이의 숫자열을 오름차순으로 정렬하여 출력하라.

T = int(input())

for tc in range(1, T+1):
    n = int(input())

    arr = list(map(int, input().split()))
    arr.sort()

    print('#{}'.format(tc), end=' ')
    for i in arr:
        print(i, end=' ')
    print()

 

#1959. 두 개의 숫자열

서로 마주보는 숫자들을 곱한 뒤 모두 더할 때 최댓값을 구하라.
아이디어 : A가 B보다 클 경우 A,B를 swap하여 B가 항상 더 길도록 설정한다.

T = int(input())

for tc in range(1, T+1):
    n,m = map(int, input().split())
    a = list(map(int, input().split()))
    b = list(map(int, input().split()))


    # B열의 길이가 더 짧을 경우, A와 B를 교환
    if len(a) > len(b):
        b,a = a,b

    result = [] # 결과각ㅄ을 저장할 리스트 초기화

    # 숫자열 B를 순회하며, A와 겹치는 부분에서의 곱의 합을 구함
    for i in range(len(b) - len(a) + 1):
        sum = 0
        for j in range(len(a)):
            sum += a[j] * b[i+j] # A와 B의 겹치는 부분에서의 숫자들을 곱
        result.append(sum)

    print('#{} {}'.format(tc, max(result)))

 

#1948. 날짜 계산기

월 일로 이루어진 날짜를 2개 입력 받아, 두 번째 날짜가 첫 번째 날짜의 며칠째인지 출력하는 프로그램을 작성하라.

아이디어 : 두 번째 날짜가 첫 번째 날짜보다 항상 크게 주어진다는 것이 포인트이다. 때문에 (날짜 - 날짜)를 계산하는 것과 (총 일수 - 총 일수)를 계산하는 결과값이 같으므로 좀 더 계산하기 쉬운 총 일수로 계산! 

총일수 : 1월 1일부터 현재날짜까지의 총 일수

T = int(input())
days = [31,28,31,30,31,30,31,31,30,31,30,31] #1월부터 12월까지 일수

for tc in range(1, 1+T):
    m1, d1, m2, d2 = map(int,input().split())

    # 첫 번째 날짜까지의 총 일수 계산(1월 1일부터)
    total_days_1 = sum(days[:m1-1]) + d1

    # 두 번째 날짜까지의 총 일수 계산
    total_days_2 = sum(days[:m2-1]) + d2

    #차이를 계산항 첫 번째 날짜부터 두 번째 날짜까지의 총 일수를 구함
    result = total_days_2 - total_days_1 + 1

    print('#{} {}'.format(tc, result))

 

#1946. 간단한 압축 풀기

원본 문서는 너비가 10인 여러 줄의 문자열로 이루어져 있다.
문자열은 마지막 줄을 제외하고 빈 공간 없이 알파벳으로 채워져 있고 마지막 줄은 왼쪽부터 채워져 있다.
이 문서를 압축한 문서는 알파벳과 그 알파벳의 연속된 개수로 이루어진 쌍들이 나열되어 있다. (예 : A 5    AAAAA)
압축된 문서를 입력 받아 원본 문서를 만드는 프로그램을 작성하시오.

아이디어 : 리스트가 아닌 str로 저장하여 10개씩 끊어서 출력한다.

T = int(input())

for tc in range(1, T+1):
    n = int(input()) # 압축된 문서의 라인 수를 입력받음

    # 원본 문서를 저장할 변수 초기화
    original_lines = ''

    for _ in range(n): # 각 라인에 대해 반복
        alpha, num = input().split()
        # 해당 알파벳을 반복 횟수만큼 반복하여 원본문서에 추가함
        original_lines += alpha * int(num)

    #원본 문서를 너비 10으로 출력함
    print('#{}'.format(tc))
    # 0부터 원본 문서 끝까지 출력하는데 10단위로 끊어서 출력
    for i in range(0, len(original_lines), 10):
        print(original_lines[i:i+10])
반응형