Python - SWEA D2

수현·2022년 11월 15일
0

Coding Test

목록 보기
2/14
post-thumbnail

📕 1859. 백만장자 프로젝트

swea 1859. 백만장자 프로젝트

문제

다음과 같은 조건 하에서 사재기를 하여 최대한의 이득을 얻도록 도와주자.

    1. 원재는 연속된 N일 동안의 물건의 매매가를 예측하여 알고 있다.
    2. 당국의 감시망에 걸리지 않기 위해 하루에 최대 1만큼 구입할 수 있다.
    3. 판매는 얼마든지 할 수 있다.
    
예를 들어 3일 동안의 매매가가 1, 2, 3 이라면 처음 두 날에 원료를 구매하여 마지막 날에 팔면 3의 이익을 얻을 수 있다.

코드

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

for test_case in range(1, T+1):
    N = int(input()) # N일 동안 물건 매매가 예측함
    price = list(map(int, input().split())) # 매매가

    max_price = price[-1] # N번째가 최댓값
    answer = 0

    # 최댓값과 N-1부터 0까지 비교 
    for i in range(N-1, -1, -1):
        if price[i] >= max_price: # 최댓값보다 크거나 같으면 최댓값으로 바꾸기
            max_price = price[i]
        else:
            answer += (max_price - price[i]) 

    print("#%d %d" %(test_case, answer))

풀이

  1. N번째 값을 max로 정하기
  2. max와 N-1번째부터 0번 까지 비교
  3. max보다 크거나 같으면 값 바꾸기
  4. max 보다 작으면 (max-값) 더하기

📕 1926. 간단한 369게임

swea 1926. 간단한 369게임

문제

1. 숫자 1부터 순서대로 차례대로 말하되, “3” “6” “9” 가 들어가 있는 수는 말하지 않는다.
  1 2 3 4 5 6 7 8 9…

2. "3" "6" "9"가 들어가 있는 수를 말하지 않는대신, 박수를 친다. 이 때, 박수는 해당 숫자가 들어간 개수만큼 쳐야 한다.  
예를 들어 숫자 35의 경우 박수 한 번, 숫자 36의 경우 박수를 두번 쳐야 한다.
 
입력으로 정수 N 이 주어졌을 때, 1~N 까지의 숫자를
게임 규칙에 맞게 출력하는 프로그램을 작성하라.

박수를 치는 부분은 숫자 대신, 박수 횟수에 맞게 “-“ 를 출력한다.

여기서 주의해야 할 것은 박수 한 번 칠 때는 - 이며, 박수를 두 번 칠 때는 - - 가 아닌 -- 이다. 

코드

T = int(input())
result = ''

for i in range(1, T+1): # 1부터 입력 숫자까지 반복 
    N = str(i)
    N_cnt = 0

    # 3, 6, 9 개수 찾기 
    if '3' in N :
        N_cnt += N.count('3')
    if '6' in N :
        N_cnt += N.count('6')
    if '9' in N :
        N_cnt += N.count('9')

    if N_cnt == 0:
        result += N
    else:
        for j in range(N_cnt): # 3,6,9 개수만큼 - 출력 
            result += '-'
    result += ' ' # 문자열에 공백 추가 
    
print(result)

풀이

  1. 1부터 입력한 수까지 차례대로 확인
  2. 그 문자열 형태의 수에 3, 6, 9 개수를 count()이용 확인
  3. 그 수만큼 '-'출력하고, 아닌 경우 원래 숫자 출력

📕 2007. 패턴 마디의 길이

swea 2007. 패턴 마디의 길이

문제

패턴에서 반복되는 부분을 마디라고 부른다. 
문자열을 입력 받아 마디의 길이를 출력하는 프로그램을 작성하라.

코드

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

for test_case in range(1, T+1):
    data = input()

    for i in range(1,10): # 문자열 길이 30 (마디 최대길이 10)
        if data[ : i] == data[i : i*2]:
            # print(data[:i]) 문자열 확인 
            print("#%d %d" %(test_case, i))
            break

풀이

마디 최대 길이가 10이기 때문에 최대 0~9과 10~19 비교하여 같으면 출력

ex) KOREA의 경우
1. i=1이면 K와 O 비교 (0번, 1번)
2. i=2이면 KO와 RE 비교 (0~1번, 2~3번)
3. i=3이면 KOR와 EAK 비교 (0~2번, 3~5번)
4. i=4이면 KORE와 AKOR 비교 (0~3번, 4~7번)
5. i=5이면 KOREA와 KOREA 비교 (0~4번, 5~9번)
6. 문자열 KOREA 찾고, i는 마디 길이

📕 1945. 간단한 소인수분해

swea 1945. 간단한 소인수분해

문제

숫자 N은 아래와 같다.
N=2a x 3b x 5c x 7d x 11e

N이 주어질 때 a, b, c, d, e 를 출력하라.

코드

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

for test_case in range(1, T+1):
    data = int(input())
    a = 0; b = 0; c = 0; d = 0; e = 0

    while(data != 1):
        if data % 2 == 0:
            a += 1
            data /= 2
        elif data % 3 == 0:
            b += 1
            data /= 3
        elif data % 5 == 0:
            c += 1
            data /= 5
        elif data % 7 == 0:
            d += 1
            data /= 7
        elif data % 11 == 0:
            e += 1
            data /= 11

    print("#{} {} {} {} {} {}".format(test_case, a, b, c, d, e))

풀이

  1. 입력값의 몫이 1이 될 때까지 while문 반복
  2. 입력값을 2, 3, 5, 7, 11로 나눠지면 각 변수값 +1

📕 1928. Base64 Decoder

swea 1928. Base64 Decoder

문제

다음과 같이 Encoding 을 한다.

1. 우선 24비트 버퍼에 위쪽(MSB)부터 한 byte씩 3 byte의 문자를 집어넣는다.

2. 버퍼의 위쪽부터 6비트씩 잘라 그 값을 읽고, 각각의 값을 아래 [표-1] 의 문자로 Encoding 한다.

입력으로 Base64 Encoding 된 String 이 주어졌을 때, 해당 String 을 Decoding 하여, 원문을 출력하는 프로그램을 작성하시오.

코드

T = int(input())

decode = ['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',
          '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',
          '0','1','2','3','4','5','6','7','8','9','+','/']

for test_case in range(1, T+1):
    data = input() # 글자 입력 

    bi_data = ''
    answer = ''

    for i in range(len(data)):
        num = decode.index(data[i]) # 입력 글자를 표에 따라 숫자로 변환

        bi_num = str(bin(num)[2:]) # 숫자를 이진수로 변환 (0b 제거)

        while len(bi_num) < 6: # 6비트씩 잘라 인코딩 하는데
            bi_num = '0' + bi_num # 1일 경우 이진수로 바꾸면 1로 나와서 (000001로 만드는 과정)

        bi_data += bi_num

    for j in range(len(data)*6//8):
        num2 = int(bi_data[j*8:j*8+8],2) #8비트씩 잘라 10진수 변환

        answer += chr(num2) # 아스키코드로 변환

    print("#{} {}".format(test_case, answer))

풀이

1) Base64 라이브러리 사용

2) 라이브러리X

  1. input값 str 입력 받아 해당 표 값 index 바꿈
  2. 해당 index를 이진수로 변환하고 하나의 str로 만듦
  3. 이진수 str을 8비트로 잘라 10진수로 변환
  4. 10진수 값을 아스키 코드에 넣고 변환

📕 1986. 지그재그 숫자

swea 1986. 지그재그 숫자

문제

1부터 N까지의 숫자에서 홀수는 더하고 짝수는 뺐을 때 최종 누적된 값을 구해보자.

[예제 풀이]

N이 5일 경우,
1 – 2 + 3 – 4 + 5 = 3

N이 6일 경우,
1 – 2 + 3 – 4 + 5 – 6 = -3

코드

T = int(input())

for test_case in range(1, T+1):
    N = int(input())
    answer = 0

    for i in range(1, N+1):
        if i%2 == 0: # 짝수일 경우
            answer -= i 
        else: # 홀수일 경우 
            answer += i
    
    print ("#{} {}".format(test_case, answer))

풀이

  1. 1부터 N까지 반복
  2. 짝수이면 빼고, 홀수이면 더하기

📕 1288. 새로운 불면증 치료법

swea 1288. 새로운 불면증 치료법

문제

민석이는 1번 양부터 순서대로 세는 것이 재미없을 것 같아서 N의 배수 번호인 양을 세기로 하였다.

즉, 첫 번째에는 N번 양을 세고, 두 번째에는 2N번 양, … , k번째에는 kN번 양을 센다.

이전에 셌던 번호들의 각 자리수에서 0에서 9까지의 모든 숫자를 보는 것은 최소 몇 번 양을 센 시점일까?

예를 들어 N = 1295이라고 하자.
첫 번째로 N = 1295번 양을 센다. 현재 본 숫자는 1, 2, 5, 9이다.
두 번째로 2N = 2590번 양을 센다. 현재 본 숫자는 0, 2, 5, 9이다.
현재까지 본 숫자는 0, 1, 2, 5, 9이다.

세 번째로 3N = 3885번 양을 센다. 현재 본 숫자는 3, 5, 8이다.
현재까지 본 숫자는 0, 1, 2, 3, 5, 8, 9이다.

네 번째로 4N = 5180번 양을 센다. 현재 본 숫자는 0, 1, 5, 8이다.
현재까지 본 숫자는 0, 1, 2, 3, 5, 8, 9이다.

다섯 번째로 5N = 6475번 양을 센다. 현재 본 숫자는 4, 5, 6, 7이다.
현재까지 본 숫자는 0, 1, 2, 3, 4, 5, 6, 7, 8, 9이다.

5N번 양을 세면 0에서 9까지 모든 숫자를 보게 되므로 민석이는 양 세기를 멈춘다.

코드

T = int(input())

for test_case in range(1, T+1):
    N = int(input()) # N의 배수 번호 
    num = []
    count = 0
    N_num = N # N의 배수 담을 변수 
    
    while(len(num) != 10): # 집합에 0~9까지 들어가면 총 10이 됨
        count += 1 # 몇 번째 
        N_num = N * count  
        
        for i in str(N_num):
            if i in num:
                continue
            else:
                num.append(i)
                num.sort()
               
    print("#{} {}".format(test_case, N*count))

풀이

  1. N을 문자열 형식으로 하나씩 배열에 집어 넣음
    ( ex) 12일 경우 1, 2 배열에 저장)
  2. 중복이 되면 안되기 때문에 배열에 있는지 비교 후 저장
  3. 배열이 0부터 9까지 10개가 있는지 확인 후 반복
  4. N의 배수로 곱하여 확인

📕 1284. 수도 요금 경쟁

swea 1284. 수도 요금 경쟁

문제

두 회사 중 더 적게 수도 요금을 부담해도 되는 회사를 고르려고 한다.
 
A사 : 1리터당 P원의 돈을 내야 한다.
B사 : 기본 요금이 Q원이고, 월간 사용량이 R리터 이하인 경우 요금은 기본 요금만 청구된다. 하지만 R 리터보다 많은 양을 사용한 경우 초과량에 대해 1리터당 S원의 요금을 더 내야 한다.
 
종민이의 집에서 한 달간 사용하는 수도의 양이 W리터라고 할 때, 요금이 더 저렴한 회사를 골라 그 요금을 출력하는 프로그램을 작성하라.

코드

T = int(input()) 

for test_case in range(1, T+1):
    P, Q, R, S, W = map(int, input().split())

    # P : 1L당 요금
    # Q : R리터 이하 요금 (기본요금)
    # S : 추가 1L당 요금
    # W : 한 달간 사용하는 수도의 양

    answer = 0

    if(R < W):
        W_A = P * W
        W_B = Q + (W-R) * S
    else:
        W_A = P * W
        W_B = Q 

    if W_A > W_B:
        answer = W_B
    else:
        answer = W_A

    print("#{} {}".format(test_case, answer))

풀이

  1. R리터보다 사용량이 크고 작을 경우로 나눔
  2. 두 요금 계산한 후 비교

📕 1989. 초심자의 회문 검사

swea 1989. 초심자의 회문 검사

문제

"level" 과 같이 거꾸로 읽어도 제대로 읽은 것과 같은 문장이나 낱말을 회문(回文, palindrome)이라 한다.

단어를 입력 받아 회문이면 1을 출력하고, 아니라면 0을 출력하는 프로그램을 작성하라.

코드

for test_case in range(1, T+1):
    data = input().replace(' ', '') # 공백 제거 
    
    answer = 0; ans = 0

    for i in range(len(data)//2):
        if(data == data[::-1]): # 문자열과 거꾸로 문자열 만든 것과 같은지 비교 
            answer = 1
        else:
            answer = 0
    
    print("#{} {}".format(test_case, answer))

풀이

  1. 입력값에 공백이 있어 공백 제거
  2. 문자열과 문자열의 역순을 같은지 비교

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

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

문제

N X N 크기의 단어 퍼즐을 만들려고 한다. 입력으로 단어 퍼즐의 모양이 주어진다.

주어진 퍼즐 모양에서 특정 길이 K를 갖는 단어가 들어갈 수 있는 자리의 수를 출력하는 프로그램을 작성하라.

코드

T = int(input())

for test_case in range(1, T+1):
    N, K = map(int, input().split())
    arr = [list(map(int, input().split())) for _ in range(N)]

    # N = 단어 퍼즐의 가로, 세로 길이 (5<=N<=15)
    # K = 단어의 길이 (2<=K<=N)

    answer = 0
    cnt = 0

    for i in range(N):
		# 행 검사 
        for j in range(N):
            if arr[i][j] == 1:
                cnt += 1
            if arr[i][j] == 0 or j == N-1: # 0을 만났을 때 cnt 초기화
                if cnt == K:  # 한 행이 끝날 때 cnt값이 K이면 answer += 1
                    answer += 1
                cnt = 0

    	# 열 검사 
        for j in range(N):
            if arr[j][i] == 1:
                cnt += 1
            if arr[j][i] == 0 or j == N-1: # 0을 만났을 때 cnt 초기화 (11001도 k=3일 경우 1이 됨)
                if cnt == K: # 한 열이 끝날 때 cnt값이 K이면 answer += 1
                    answer += 1
                cnt = 0

    print("#{} {}".format(test_case, answer))

풀이

  1. 입력 값을 배열에 저장후 행, 열로 검사
  2. 1이 나오는 개수를 확인하는데, 1이 연속한 수가 K개여야 하기 때문에 0이 나올 경우 cnt값을 초기화 ( ex) K가 3일때, 11001도 cnt=3이 되어 맞는 것처럼 세어짐)
  3. 확인한 cnt값이 K와 같을 경우 answer += 1

📕 1959. 두 개의 숫자열

swea 1959. 두 개의 숫자열

문제

코드

T = int(input())

for test_case in range(1, T+1):
    N, M = map(int, input().split())

    A = list(map(int, input().split()))
    B = list(map(int, input().split()))

    answer = 0

    if N == M:
        for i in range(N):
            answer += A[i] * B[i]
    else:
        if N > M: # 기본은 예시처럼 M > N 인 경우임
            N, M = M, N
            A, B = B, A
        
        for i in range(M-N+1): # B
            max = 0
            for j in range(N): # A
                max += A[j] * B[j+i]

            if max > answer:
                answer = max
                
    print("#{} {}".format(test_case, answer))

풀이

  1. 두 개의 문자열 길이 중 큰 것-작은 것을 구하기
  2. 그 수만큼 작은것과 큰것 반복해 최댓값 구해서 비교

📕 1948. 날짜 계산기

swea 1948. 날짜 계산기

문제

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

코드

T = int(input())

month = {1: 31, 2: 28, 3: 31, 4: 30, 5: 31, 6: 30, 7: 31, 8: 31, 9: 30, 10: 31, 11: 30, 12: 31}

for test_case in range(1, T+1):
    date = list(map(int, input().split()))
    answer = 0

    if date[0] == date[2]:
        answer = date[3] - date[1] + 1
    else:
        answer += month[int(date[0])]-int(date[1]) + 1 # 시작 월의 날짜 계산
        answer += int(date[3])                 # 끝 월의 날짜 계산
        for i in range(date[0]+1, date[2]): # 사이 월의 날짜 계산
            answer += month[int(i)]

    print("#{} {}".format(test_case, answer))

풀이

  1. 월이 같을 경우 날짜만 빼서 계산
  2. 월이 다를 경우
    (1) 시작 월은 딕셔너리에서 해당 월의 끝에서 날짜 빼서 계산
    (2) 시작과 끝 사이의 월은 딕셔너리에서 해당 월의 끝을 더해줌
    (3) 끝 월은 그냥 날짜 더해서 계산

📕 1940. 가랏! RC카!

swea 1940. 가랏! RC카!

문제

RC (Radio Control) 카의 이동거리를 계산하려고 한다.
입력으로 매 초마다 아래와 같은 command 가 정수로 주어진다.

0 : 현재 속도 유지.
1 : 가속
2 : 감속
위 command 중, 가속(1) 또는 감속(2) 의 경우 가속도의 값이 추가로 주어진다.

가속도의 단위는, m/s2 이며, 모두 양의 정수로 주어진다.
입력으로 주어진 N 개의 command 를 모두 수행했을 때, N 초 동안 이동한 거리를 계산하는 프로그램을 작성하라.
RC 카의 초기 속도는 0 m/s 이다.

코드


for test_case in range(1, T+1):
    N = int(input()) # Command의 수
    answer = 0 # 카의 이동 거리 
    num = 0 # 현재 RC카의 속도 

    # Command + 가속도의 값
    # 0 : 현재 속도 유지.
    # 1 : 가속
    # 2 : 감속 

    for i in range(N):
        com = list(map(int, input().split()))

        if com[0] == 1:
            num += com[1]
        elif com[0]== 2:
            num -= com[1]

        if num >= 0:
            answer += num
        else: # 속도가 음수일 경우 속도 0으로 유지 
            num = 0

    print("#{} {}".format(test_case, answer))

풀이

  1. command와 가속도 값을 배열로 저장
  2. command별로 속도에 가속도 조정
    (1) com = 1일 경우 속도+가속도
    (2) com = 2일 경우 속도-가속도
    (3) com = 0일 경우 속도 유지
  3. 이동 거리는 현재 거리에 현재 속도 더해 계산

📕 1966. 숫자를 정렬하자

swea 1966. 숫자를 정렬하자

문제

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

코드

T = int(input())

for test_case in range(1, T+1):
    N = int(input())
    data = list(map(int, input().split()))
    answer = ''

    data.sort() # 데이터 정렬
    
    for i in data:
        answer += str(i)
        answer += ' '

    print("#{} {}".format(test_case, answer))

풀이

  1. 입력 받은 데이터를 리스트로 저장한 후 정렬
  2. 출력시에는 공백 포함해 문자열로 출력

📕 1961. 숫자 배열 회전

swea 1961. 숫자 배열 회전

문제

N x N 행렬이 주어질 때,

시계 방향으로 90도, 180도, 270도 회전한 모양을 출력하라.

코드

T = int(input())

for test_case in range(1, T+1):
    N = int(input()) # N X N 행렬
    arr = [list(map(int, input().split())) for _ in range(N)]
    answer = []

    # 90, 180, 270 회전할 배열 초기화
    arr_90 = [ [0 for _ in range(N)] for _ in range(N)] # N X N 행렬
    arr_180 = [ [0 for _ in range(N)] for _ in range(N)]
    arr_270 = [ [0 for _ in range(N)] for _ in range(N)]

    # arr 행렬 90도 회전
    for i in range(N):
        for j in range(N):
            arr_90[i][j] = arr[N-1-j][i]
    # arr 행렬 180도 회전
    for i in range(N):
        for j in range(N):
            arr_180[i][j] = arr_90[N-1-j][i] # 90도 행렬을 90도 회전
    # arr 행렬 270도 회전
    for i in range(N):
        for j in range(N):
            arr_270[i][j] = arr_180[N-1-j][i] # 180도 행렬을 90도 회전

    print("#{} ".format(test_case))
    for i in range(N):
        for a in range(N):
            print(arr_90[i][a], end='')
        print(end=" ")
        for b in range(N):
            print(arr_180[i][b], end='')
        print(end=" ")
        for c in range(N):
            print(arr_270[i][c], end='')
        print( )

풀이

  1. 90도 회전 [i][j] = [N-1-j][i]
  2. 90도 회전을 90도 회전하면 = 180도 회전
  3. 회전한 배열을 저장할 배열만들고 저장

📕 1954. 달팽이 숫자

swea 1954. 달팽이 숫자

문제

달팽이는 1부터 N*N까지의 숫자가 시계방향으로 이루어져 있다.

다음과 같이 정수 N을 입력 받아 N크기의 달팽이를 출력하시오.

코드

T = int(input())

for test_case in range(1, T+1):
    N = int(input()) # 달팽이 크기 
    arr = [[0 for _ in range(N)] for _ in range(N)] # 달팽이 숫자 배열

    stock = 0 # cycle 마다 축적된 sum의 값

    for i in range(N//2): # 짝수는 딱 떨어지고, 홀수는 1번 부족하게
        cycle = ((N-1)-2*i)

        for j in range(cycle):
            arr[i][i + j] = stock + j+1
            arr[i + j][(N-1)-i] = stock + (cycle)+(j+1)
            arr[(N-1)-i][(N-1)-(i + j)] = stock + 2*(cycle)+(j+1)
            arr[(N-1)-(i + j)][i] = stock + 3*(cycle)+(j+1)
        stock += 4 * cycle # 사이클 마지막 값을 다음 시작점에 더함

    if N % 2 == 1: # 홀수일 경우 
        arr[N//2][N//2] = N**2 # NXN행렬 가운데에 N의 제곱 저장

    print(f'#{test_case}')

    for lines in range(len(arr)): # 각 라인 출력
        print(*arr[lines])

풀이

[참고] https://velog.io/@datamarksman/SWEA-1954.-%EB%8B%AC%ED%8C%BD%EC%9D%B4%EC%88%AB%EC%9E%90

📕 [S/W 문제해결 기본] 1일차 - 최빈수 구하기

swea [S/W 문제해결 기본] 1일차 - 최빈수 구하기

문제

1000명의 수학 성적을 토대로 최빈수를 출력하는 프로그램을 작성하여라.

다음과 같은 수 분포가 있으면,

10, 8, 7, 2, 2, 4, 8, 8, 8, 9, 5, 5, 3

최빈수는 8이 된다.
(단, 최빈수가 여러 개 일 때에는 가장 큰 점수를 출력하라)

코드

T = int(input()) 

for test_case in range(1, T+1):
    N = int(input()) # 테스트 케이스 번호 
    score = list(map(int, input().split())) # 1000개의 점수
    data = [0] * 1001
    answer = []

    for i in score:  # 각 숫자가 몇개 있는지 저장하는 배열 
        data[i] += 1

    val = max(data) # 가장 많이 있는 숫자의 최대 개수 

    for j in range(len(data)): # 가장 많이 있는 숫자가 뭔지 찾기
        if data[j] == val:
            answer.append(j)

    print("#{} {}".format(N, max(answer)))

풀이

  1. 각 숫자가 몇개 있는지 확인하기 위해 data배열에 저장
  2. 가장 많이 있는 숫자의 개수를 알기 위해 data 배열에서 최댓값 구하기
  3. 가장 많이 있는 숫자를 구하기 위해 data배열에서 최댓값과 개수 비교
  4. 구해진 정답 배열 중 최댓값 출력

📕 2001. 파리 퇴치

swea 2001. 파리 퇴치

문제

코드

T = int(input())

for test_case in range(1, T+1):
    N, M = map(int, input().split()) 
    arr = [list(map(int, input().split())) for _ in range(N)]
    # N = NXN 배열의 크기
    # M = MXM 파리채의 크기 
    num_max = []  # 파리 갯수 최댓값

    for i in range(N-M+1): # 0부터 N-M까지 확인 
        for j in range(N-M+1): # M 개수만큼 더하기 
            num = 0 # 파리 갯수 합 

            for a in range(M): # 파리채 박스안의 값 더하기
                for b in range(M):
                    num += arr[i+a][j+b]
            
            num_max.append(num)
    
    answer = max(num_max)
    print("#{} {}".format(test_case, answer))

풀이

  1. 0~N-M까지 박스의 시작점 지정
  2. 시작점부터 M-1번 돌며 박스 안 숫자 합 구하기
  3. 파리 갯수 합을 배열에 저장하여 파리 갯수 최댓값 구하기

📕 1974. 스도쿠 검증

swea 1974. 스도쿠 검증

문제

코드

T = int(input())

for test_case in range(1, T+1):
    sudoku = [list(map(int, input().split())) for _ in range(9)] # 스도쿠는 9 X 9 배열 
    answer = 1

    for i in range(9): 
        arr1 = [0] * 10 # 세로 확인 배열
        arr2 = [0] * 10 # 가로 확인 배열

        for j in range(9):
            arr1[sudoku[j][i]] += 1 # 세로 배열 확인
            arr2[sudoku[i][j]] += 1 # 가로 배열 확인

        for k in range(1, 10):
            if arr1[k] != 1:
                answer = 0
                break
            if arr2[k] != 1:
                answer = 0
                break

    for i in range(0, 9, 3):
        for j in range(0, 9, 3):
            arr3 = [0] * 10 # 3X3 확인 배열 
            
            for a in range(3):
                for b in range(3):
                    arr3[sudoku[i+a][j+b]] += 1 # 3X3 배열 확인 

            for k in range(1,10):
                if arr3[k] != 1:
                    answer = 0
                    break

    print("#{} {}".format(test_case, answer))

풀이

  1. 가로, 세로, 3X3 확인하며 각 숫자의 위치에 숫자가 있으면 +1
  2. 그 배열을 확인하며 0이면 return 0, 1일 경우 return 1

📕 2005. 파스칼의 삼각형

swea 2005. 파스칼의 삼각형

문제

코드

T = int(input())

for test_case in range(1, T+1):
    N = int(input())
    arr = [[0]*N for _ in range(N)]

    for i in range(N):
        for j in range(i+1):
            if j==0 or j==i:
                arr[i][j] = 1
            else:
                arr[i][j] = arr[i-1][j]+arr[i-1][j-1]

    print("#{} ".format(test_case))
    for line in arr:
        answer = [x for x in line if x] # 0 제외하고 출력
        print(*answer) # [] 제외하고 출력 

풀이

  1. 맨 처음이거나 끝이면 1 저장
  2. 그 사이는 왼쪽과 오른쪽 위의 숫자 더해 저장

📕 1976. 시각 덧셈

swea 1976. 시각 덧셈

문제

시 분으로 이루어진 시각을 2개 입력 받아, 더한 값을 시 분으로 출력하는 프로그램을 작성하라.

(시각은 12시간제로 표시한다. 즉, 시가 가질 수 있는 값은 1시부터 12시이다.)

코드

T = int(input())

for test_case in range(1, T+1):
    h1, m1, h2, m2 = map(int, input().split())

    hour = h1 + h2
    min = m1 + m2

    if min >= 60:
        hour += 1
        min -= 60

    if hour > 12:
        hour -= 12

    print("#{} {} {}".format(test_case, hour, min))

풀이

  1. 시와 분을 입력 받아 더하기
  2. 분이 60분이 넘으면 시에 1을 더한 후, 분에 60분 빼기
  3. 12시간제라서 시가 12 초과이면 12시 빼기

📕 1970. 쉬운 거스름돈

swea 1970. 쉬운 거스름돈

문제

우리나라 화폐 ‘원’은 금액이 높은 돈을 우선적으로 계산할 때 돈의 개수가 가장 최소가 된다.

S마켓에서 사용하는 돈의 종류는 다음과 같다.
50,000 원
10,000 원
5,000 원
1,000 원
500 원
100 원
50 원
10 원

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

코드

T = int(input())

for test_case in range(1, T+1):
    N = int(input()) # 손님에게 거슬러 줘야 할 금액

    money = [50000, 10000, 5000, 1000, 500, 100, 50, 10]
    answer = [0] * 8

    for i in range(8):
        if N // money[i] != 0:
            answer[i] = N //money[i]
            N = N % money[i]

    print("#{}".format(test_case))
    print(*answer)

풀이

  1. 각 금액을 배열에 저장
  2. 전체 N에 금액과 나눈 몫을 저장해두고, N은 금액의 나머지로 바꾸기

📕 1983. 조교의 성적 매기기

swea 1983. 조교의 성적 매기기

문제

코드

T = int(input())

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

for test_case in range(1, T+1):
    N, K = map(int, input().split()) # N = 학생수, K = 학점을 알고싶은 학생의 번호 
    data = []
    sum_abc = 0

    for i in range(N):
        a, b, c = map(int, input().split())
        sum_abc = a*0.35 + b*0.45 + c*0.20
        data.append(sum_abc)

    K_value = data[K-1]
    data.sort(reverse=True) # 역순으로 정렬 (큰게 앞으로)

    value = N // 10 # 10보다 클 경우 동일한 평점 
    answer = data.index(K_value) // value

    print("#{} {}".format(test_case, score[answer]))

풀이

  1. 점수 입력 받아서 합 계산해 data배열에 저장
  2. K번째 학생 점수 저장
  3. data 배열을 (역순으로) 정렬한 후 K번째 점수의 index 번호 출력
  4. 그 번호에 맞는 학점 출력

📕 1946. 간단한 압축 풀기

swea 1946. 간단한 압축 풀기

문제

원본 문서는 너비가 10인 여러 줄의 문자열로 이루어져 있다.

문자열은 마지막 줄을 제외하고 빈 공간 없이 알파벳으로 채워져 있고 마지막 줄은 왼쪽부터 채워져 있다.

이 문서를 압축한 문서는 알파벳과 그 알파벳의 연속된 개수로 이루어진 쌍들이 나열되어 있다. (예 : A 5    AAAAA)

코드

T = int(input())

for test_case in range(1, T+1):
    N = int(input())
    result = []
    
    for i in range(N):
        data, count = input().split()

        for j in range(int(count)):
            result.append(data)

    print("#{}".format(test_case))

    for i in range(len(result)):
        if (i+1) % 10 == 0:
            print(result[i])
        else:
            print(result[i], end='')
    print()

풀이

  1. result 배열에 주어진 문자를 주어진 숫자만큼 반복해 더함
  2. 출력시 너비가 10이므로 10개씩 끊어서 출력

📕 1984. 중간 평균값 구하기

swea 1984. 중간 평균값 구하기

문제

10개의 수를 입력 받아, 최대 수와 최소 수를 제외한 나머지의 평균값을 출력하는 프로그램을 작성하라.

(소수점 첫째 자리에서 반올림한 정수를 출력한다.)

코드

T = int(input())

for test_case in range(1, T+1):
    data = list(map(int, input().split()))
    num = 0 # 나머지 수 모두 더한 합 

    data.sort() # 정렬
    
    for i in range(1,9): # 최대 수와 최소 수 제외
        num += data[i]

    answer = round(num/8)

    print("#{} {}".format(test_case, answer))

풀이

  1. 배열에 저장한 후 정렬
  2. 최대 수와 최소 수를 제외한 값을 더한 후 8로 나누기 (평균 구하기)

📖출처📖

SWEA python

profile
Notion으로 이동 (https://24tngus.notion.site/3a6883f0f47041fe8045ef330a147da3?v=973a0b5ec78a4462bac8010e3b4cd5c0&pvs=4)

0개의 댓글