프로그래밍 언어/Python

[Python 실습] Coding Test - 1

eunnys 2023. 10. 30. 10:21

[문제-1] 문자열을 구성하는 문자의 개수 세기
- 사용자로부터 임의의 문자열을 입력받아 해당 문자열을 구성하는 문자들 및 각 문자의 개수를 출력하는 프로그램을 작성하세요.
   

[예시]
입력: 가가가bbbbcc#

출력: 가3b4c2#1

data = input('입력: ')
mydic = {s:data.count(s) for s in data}
print('출력: ', end='') # for문 밖에 출력을 써줌
for k,v in mydic.items():  # key값과 value값을 가져와줌
    print(k,v,sep='',end='')

 

 

[문제-2] 분리한 문자열의 첫 번째 문자 출력하기
- 사용자로부터 임의의 문자열을 입력 받아 공백을 기준으로 분리한 루, 분리된 문자열의 첫 번째 글자만 모아서 출력하는 프로그램을 작성하세요.
    

[예시]
입력: ABC DEF GHI
출력: A,D,G

data = input('입력: ')
s = data.split() # 공백을 기준으로 구분하고 리스트로 가져와줌
print('출력: ', end='')
for i in range(len(s)-1):
    print(s[i][0], end = ',')
print(s[i+1][0])
data = input('입력: ')
print('출력: ', end='')
for word in data.split():
    print(word[0], end=',')
print('\b') # 마지막에 찍히는 ,를 지워줌

 

 

[문제-3] 회문 구하기
- 문자열을 입력받아 해당 문자열이 회문(palindrome)인지 여부를 판단하는 프로그램을 작성하세요.
- 단, 입력받는 문자열의 길이는 3자 이상이어야 한다.
    

[예시]
입력: abba
출력: abba는 회문입니다.

입력: korea
출력: korea는 회문이 아닙니다.

입력: 소주만병만주소
출력: 소주만병만주소는 회문입니다.

text = input('입력: ')
result = '회문입니다.' if text == text[::-1] else '회문이 아닙니다.'
print(f'{text}는 {result}')

 

 

[문제-4] 순차적으로 문자열 변환하기
- 사용자로부터 임의의 문자열을 입력 받아 가장 마지막 문자부터 '#'으로 하나씩 변환해가며 출력하는 프로그램을 작성하세요.
    

[예시]
입력: AbcdEf
출력:
AbcdE#
Abcd##
Abc###
Ab####
A#####
######

text = input('입력: ')
print('출력: ')
for w in range(1,len(text)+1):
    print(text[0:len(text)-w]+'#'*w)
text = input('입력: ')
print('출력: ')
for w in range(len(text)):  # w는 0부터 시작
    print(text[:len(text)-(w+1)]+('#')*(w+1)) # w+1을 해야 1부터 시작

 

 

[문제-5] 소문자 치환
- 사용자로부터 임의의 문자열을 입력 받아 해당 문자열 내 모든 소문자를 '#'으로 변환하여 출력하는 프로그램을 작성하세요.

(소문자 여부 확인: 문자열 객체 함수인 islower() 사용)
    

[예시]
입력: abCDeFg
출력: ##CD#F#

text = input('입력: ')
result = ''
for i in text:
    if i.islower():
        result += '#'
    else:
        result += i
print('출력: ', result)
text = input('입력: ')
result = ['#' if s.islower() else s for s in text]
print('출력:', ''.join(result))

 

 

[문제-6] 문자열 검색
- 사용자로부터 입력 받은 문자열의 개수를 입력 받고, 검색할 단어를 입력 받은 후, 앞서 입력 받은 숫자만큼 문자열을 입력 받는다. 이후 해당 문자열에서 검색어를 포함하는 문자열을 출력하되, 검색어가 존재하지 않을 경우 "검색결과없음"을 출력하는 프로그램을 작성하세요.
    

[예시]
입력할 단어 개수: 3
검색할 단어: ab

단어입력-1: abba
단어입력-2: oppa
단어입력-3: BCabD

검색결과:
abba
BCabD

count = int(input('입력할 단어 개수: '))
search = input('검색할 단어: ')
result = []

for i in range(1, count + 1):
    word = input(f'단어입력-{i}: ')
    if search in word:
        result.append(word)
if result:
    print('검색결과:')
    for s in result:
        print(s)
else:
    print('검색결과없음')
num = int(input('입력할 단어 개수: '))
keyword = input('검색할 단어: ')

input_string = [input('단어입력-%d'%(i+1)) for i in range(num)]
print('검색결과:')
find = False
for s in input_string:
    if keyword in s:  # if s.find(keyword) != 1: 어느 위치에 있는지
        print(s)
        find = True
if not find:
    print('검색 결과가 없습니다.')

 

 

[문제-7] 규칙에 따라 문자 변환하기
- 사용자로부터 임의의 문자열을 입력 받아 아래와 같은 규칙에 따라 변환한 후 출력하는 프로그램을 작성하세요.
    (규칙)
    A -> 4
    E -> 3
    G -> 6
    I -> 1
    O -> 0
    S -> 5
    Z -> 2

    [예시]
    입력: Ag#IZklS
    출력: 4g#12kl5

text = input('입력: ')
dic = {'A':'4','E':'3','G':'6','I':'1','O':'0','S':'5','Z':'2'}
result = ''
for i in text:
    if i in dic:
        result += dic[i]
    else:
        result += i
print('출력:', result)
text = input('입력:')
dic = {'A':4,'E':3,'G':6,'I':1,'O':0,'S':5,'Z':2}
result = [str(dic.get(i,i)) for i in text]
print('출력:', ''.join(result))

 

 

[과제] Tic-Tac-Toe 게임 만들기
- Tic Tac Toe 게임이란 3행3열의 말판에 두 명이 번갈아가며 O와 X를 써서, 먼저 3개의 같은 문자를 가로, 세로 또는 대각선상에 놓이도록 하는 게임이다.
- 말판은 3X3의 이중 리스트를 이용하여 값 저장 및 출력을 한다.
- 9개의 칸이 모두 채워졌지만 3개의 연속된 같은 문자가 없는 경우는 무승부로 하고 게임을 종료한다.
- 이미  O 또는 X로 선택되어 있는 번호를 고른 경우 무시하고 다시 입력받는다.

board = [['1', '2', '3'],
         ['4', '5','6'],
         ['7', '8', '9']]
player = 'X'
turn = 0

while True:
    for row in board:
        print("+---+---+---+")
        print(f'| {row[0]} | {row[1]} | {row[2]} |')
    print("+---+---+---+")
    print('** Player[{}]님이 말을 놓을 차례입니다.'.format(1 if player == 'X' else 2))

    while True:
        choice = int(input(f'**말 {player}를 놓을 위치의 번호를 입력하세요: '))
        row = (choice - 1) // 3 
        col = (choice - 1) % 3
        if board[row][col] in ['X', 'O']:
            print('이미 선택된 위치입니다. 다시 시도하세요.')
        else:
            board[row][col] = player
            break
       
    winner = False

    # 한 행에 모두 같은 말이 놓였는지 확인
    for row in board:
        if all(cell == player for cell in row): # all 함수는 모든 요소가 조건을 만족하면 True 반환
            winner = True
            break
    
    # 만약 발견하지 못했다면 한 열에 모두 같은 말이 놓였는지 확인
    if not winner:
        for col in range(3):
            if all(board[row][col] == player for row in range(3)): 
                winner = True
                break
    # 만약 발견하지 못했다면 대각선 방향으로 확인 (2가지 방향)
    if not winner:
        if all(board[i][i] == player for i in range(3)) or all(board[i][2-i] == player for i in range(3)):
            winner = True

    if winner:
        for row in board:
            print("+---+---+---+")
            print(f'| {row[0]} | {row[1]} | {row[2]} |')
        print("+---+---+---+")

        print('Player[{}]님의 승리! 축하합니다.'.format(1 if player == 'X' else 2))
        break
    
    turn += 1
    if turn == 9:
        for row in board:
            print("+---+---+---+")
            print(f'| {row[0]} | {row[1]} | {row[2]} |')
        print("+---+---+---+")
        print('무승부입니다.')
        break
    
    player = 'X' if player == 'O' else 'O'

 

 

[문제-8] key 기준으로 합계 구하기
- 사용자로부터 key:value 형태로 반복해서 데이터를 입력받는다. 이때 key는 문자열, value는 정수 형태이며, 중복되는 key를 입력 받은 경우 기존에 입력되어 있는 value에 새로 입력 받은 value를 합한다. 그리고 사용자가 'exit'를 입력하면 이전까지 입력받았던 모든 key와 value를 key=value 형태로 출력하는 프로그램을 작성하세요.
    

[예시]

입력:
a:1
b:2
c:3
a:4
c:1
exit
출력:
a=5
b=2
c=4

my_dic = {}
print('입력:')
while True:
    data = input()
    data_split = data.split(':')
    if data == 'exit':
        break
    else:
        if data_split[0] not in my_dic.keys():
            my_dic[data_split[0]] = int(data_split[1])
        else:
            my_dic[data_split[0]] += int(data_split[1])
print('출력:')
for k, v in my_dic.items():
    print(k, '=', v)
print('입력:')
data = dict() # 입력된 key와 value를 저장할 저장 공간, data = {}
while True:
    input_data = input() # 키보드로 값 입력
    if input_data == 'exit': # 무한 반복문을 빠져나갈 조건을 검사
        break
    split_data = input_data.split(':') # split() 함수는 결과를 list로 반환
    key = split_data[0]
    value = int(split_data[1]) # 정수로 바꿔줌
    if data.get(key) == None: # get(key) 함수는 key가 존재하지 않을 경우 None을 반환
        data[key] = value # dictionary에 새로운 key, value를 저장
    else:
        data[key] += value # data[key] = data[key] + value
print('출력:')
for k, v in data.items(): # items() -> [(k,v), (k,v) ...] 결과 반환
    print(k, '=', v)
print('입력:')
data = dict() # 입력된 key와 value를 저장할 저장 공간, data = {}
while True:
    input_data = input() # 키보드로 값 입력
    if input_data == 'exit': # 무한 반복문을 빠져나갈 조건을 검사
        break
    split_data = input_data.split(':') # split() 함수는 결과를 list로 반환
    key = split_data[0]
    value = int(split_data[1])
    data[key] = data.get(key, 0) + value # 기존에 key가 존재하면 그 key값을 가져와서 value에 더해줌, 존재하지 않으면 0으로 반환하고 value값을 더해줌
print('출력:')
for k, v in data.items(): # items() -> [(k,v), (k,v) ...] 결과 반환
    print(k, '=', v)

 

 

[문제-9] 성적 처리 프로그램
- 사용자로부터 총 학생의 수와 합격 기준점수를 입력 받는다.
- 그리고 각 학생의 성적과 결석 일수를 공백으로 구분하여 순차적으로 입력 받는다.
- 결석 일수 1일당 5점씩 감점하여 최종 성적을 계산한다.
- 점수와 결석일수, 최종 성적과 합격 여부를 출력한다.
    

[예시]
입력:
학생 수: 3
합격 기준 점수: 60

1번 학생 점수와 결석 일수 ('100 0' 형식): 100 0
2번 학생 점수와 결석 일수 ('100 0' 형식): 60 0
3번 학생 점수와 결석 일수 ('100 0' 형식): 80 5
총점:
점수   결석     성적     합격어부
100      0        100      합격
60        0         60       합격
80        5         55       불합격

print('입력:')
student = int(input('학생 수:'))
pass_score = int(input('합격 기준 점수:'))
result = []

for i in range(student):
    student_score = input(f"{i+1}번 학생 점수와 결석 일수 ('100 0' 형식): ")
    score_split = student_score.split()
    result.append(score_split)
    
print('출력:')
print('점수\t결석\t성적\t합격여부')

for x in range(student):
    if (int(result[x][0])) - (int(result[x][1]) * 5) >= pass_score:
        print(f'{result[x][0]}\t{result[x][1]}\t{(int(result[x][0])) + (int(result[x][1]) * -5)}\t합격')
    else:
        print(f'{result[x][0]}\t{result[x][1]}\t{(int(result[x][0])) + (int(result[x][1]) * -5)}\t불합격')
print('입력:')

numOfStudents = int(input('학생 수:'))
cutLine = int(input('합격 기준 점수:'))

score_data = [] # 전체 학생의 성적 정보를 저장할 list
for i in range(1, numOfStudents+1):
    input_data = input(f"{i}번 학생 점수와 결석 일수 ('100 0' 형식): ")
    score = int(input_data.split()[0])
    absent = int(input_data.split()[1])
    final_score = score - (absent*5)
    pass_fail = '합격' if final_score >= cutLine else '불합격'
    score_data.append([score, absent, final_score, pass_fail]) # 이중리스트가 만들어짐

print('출력:')
print('점수', '결석', '성적', '합격여부', sep='\t')
for s in score_data:
    print('%3d\t%3d\t%3d\t%s'%(s[0], s[1], s[2], s[3]))

 

 

[문제-10] 2차원 행렬 회전하기
- 다음과 같은 3행3열의 리스트를 생성하고, 사용자로부터 임의의 값을 입력 받을 때마다 시계 방향으로 90도씩 회전하여 출력하는 프로그램을 작성하세요
- 단, 사용자가 입력한 값이 'exit'일 경우 프로그램을 종료할 것.
    [[1,2,3],
    [4,5,6],
    [7,8,9]]

    [예시]
    123
    456
    789
    입력: a

    741
    852
    963
    입력: a

    987
    654
    321
    입력: exit

# 변환 규칙: 90도 회전 시 첫 번째 열의 값이 첫 번째 행의 값으로 변환
# (0,0) -> (0,2)
# (1,0) -> (0,1)
# (2,0) -> (0,0)

import copy 

matrix = [[1,2,3],
          [4,5,6],
          [7,8,9]]

while True:
    # 깊은 복사를 하지 않으면 두 리스트가 같은 참조값을 가지고 있기 때문에 원본값의 변화의 영향을 받는다.
    mcopy = copy.deepcopy(matrix) # mcopy = matrix[:]
    for row in mcopy:
        print(f'{row[0]} {row[1]} {row[2]}')
    if input('입력:') == 'exit': break
        
    for i in range(3):
        for j in range(3):
            matrix[i][2-j] = mcopy[j][i]
import copy 

matrix = [[1,2,3],
          [4,5,6],
          [7,8,9]]

while True:
    # 깊은 복사를 하지 않으면 두 리스트가 같은 참조값을 가지고 있기 때문에 원본값의 변화의 영향을 받는다.
    mcopy = copy.deepcopy(matrix)
    for i in matrix:
        print(i[0], i[1], i[2], sep='')

    if input('입력') == 'exit': break

    for i in range(len(matrix)): # 1차원 배열의 크기만큼 반복
        for j in range(len(matrix[i])): # 2차원(서브) 배열의 크기만큼 반복
            matrix[i][2-j] = mcopy[j][i] # matrix = i는 고정, j는 2,1,0 / mcopy = i는 고정, j는 0,1,2

 

 

[문제-11] 펙토리얼 구하기
- n!(n 팩토리얼)은 1부터 n까지 존재하는 모든 자연수의 곱을 의미한다.
- 사용자로부터 어떤 정수 n을 입력 받아 n!의 값을 출력하는 프로그램을 작성하세요.
    

[예시]
입력: 5
출력: 5! = 120

num = int(input('입력:'))
multi = 1
for i in range(1, num+1, 1):
    multi *= i
print(f'출력: {num}! = {multi}')
n = int(input('입력:'))
result = n
for i in range(n-1, 0, -1):
    result *= i
print('출력: %d! = %d'%(n, result))
# 재귀 함수를 사용해 팩토리얼 구하기
n = int(input('입력:'))
def factorial(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n-1)
print(f'출력: {n}! =', factorial(n))

 

 

[문제-12] 피보나치 수열 구하기
- 피보나치 수열은 첫째 및 둘째 항이 1이며, 그 이후 항은 바로 앞 두 항의 합으로 이루어진 수열을 말한다. 사용자로부터 임의의 양의 정수를 입력 받아 입력 받은 수보다 작거나 같은 수로만 이루어진 피보나치 수열을 출력하는 프로그램을 작성하세요.
    

[예시]
입력: 10
출력: 1, 1, 2, 3, 5, 8

n = int(input('입력:'))
fibo = [1,1]
while True:
    next_fibo = fibo[-1] + fibo[-2]
    if next_fibo <= n:
        fibo.append(next_fibo)
    else: break
print(f'출력: {fibo}')
n = int(input('입력:'))

first = 1
second = 1
sum = 0
print(1, 1, sep=',', end=',')
while True:
    sum = first + second
    if sum > n: break
    print(sum, end=',')
    first = second
    second = sum
print('\b')

 

 

[문제-13] 타자 프로그램
- 애국가 1절을 각 소절마다 타이핑하며 정확도와 타자속도를 출력한다.
   

    [예시]
    (1/4)
    동해물과 백두산이 마르고 닳도록
    동해물과 배두산이 마르고 닳도록
    타자속도: 130타/분, 정확도: 94%

    (4/4)
    대한사람 대한으로 길이 보전하세
    대한사람 대한으로 길이 보전하세
    타자속도: 230타/분, 정확도: 100%
    ---------------------------------------
                    타자결과
    ---------------------------------------
    평균 타자속도: 189타/분, 평균 정확도: 93%
    분당 타자 속도 -> 입력소요시간(초):입력 글자수 = 1분(60초):x

import time

song = ['동해물과 백두산이 마르고 닳도록','하느님이 보우하사 우리나라 만세',
       '무궁화 삼천리 화려 강산', '대한사람 대한으로 길이 보전하세']

total_speed = 0
total_accuracy = 0

for i, verse in enumerate(song, 1):
    print(f'({i}/{len(song)})')
    print(verse)
    start = time.time()
    user = input()
    end = time.time()
    
    compare = 0
    for o, t in zip(verse, user):
        if o == t:
            compare += 1
    speed = (len(user)*60) / (end-start)
    accuracy = (compare/len(verse))*100
    print(f'타자속도:{speed:.0f}타/분, 정확도:{accuracy:.0f}%')
    total_speed += speed
    total_accuracy += accuracy
    print()
    average_speed = total_speed / len(song)
    average_accuracy = total_accuracy / len(song)

print('---------------------------------------')
print('                타자결과               ')
print('---------------------------------------')
print(f'평균 타자속도:{int(average_speed):.0f}타/분, 평균 정확도:{average_accuracy:.0f}%')
import time

sentence = ['동해물과 백두산이 마르고 닳도록',
            '하느님이 보우하사 우리나라 만세',
            '무궁화 삼천리 화려 강산', 
            '대한사람 대한으로 길이 보전하세']

sumOfTypeSpeed = 0
sumOfAccuracy = 0

for i, s in enumerate(sentence, start=1): # enumerate() -> (i = index, s = value) 튜플의 형태로 반환
    print(f'{i}/{len(sentence)}')
    print(s) # 첫 번째 소절 출력
    start = time.time()
    input_text = input()
    end = time.time()
    hitCount = 0
    # 원문: 동해물과 백두산이 마르고 닳도록
    # 입력: 동매무과 배두산이 마르고 닳도록
    # hhitCount -> 15, 원문 글자 수 -> 17
    for original_char, input_char in zip(s, input_text): 
        if original_char == input_char:
            hitCount += 1
    typeSpeed = (len(input_text) * 60) / (end-start) # 입력 글자수 * 60초 / 입력소요시간(초)
    accuracy = (hitCount/len(s)) * 100             # (원문과 일치한 글자 수 / 원본 글자 수) * 100
    print(f'타자속도:{typeSpeed:.0f}타/분, 정확도:{accuracy:.0f}%')
    print()
    sumOfTypeSpeed += typeSpeed
    sumOfAccuracy += accuracy

print('---------------------------------------')
print('                타자결과               ')
print('---------------------------------------')
print(f'평균 타자속도:{sumOfTypeSpeed/len(sentence):.0f}타/분, 평균 정확도:{sumOfAccuracy/len(sentence):.0f}%')