본문 바로가기
백준 (코테)

6. [6단계] 제목: 심화 1단계

by 코린이의 세계 2024. 8. 14.
1단계.
새싹을 출력한다.

답: print("         ,r\'\"7")
print("r`-_   ,\'  ,/")
print(" \\. \". L_r\'")
print("   `~\\/")
print("      |")
print("      |")

' 이나 " 을 출력하고 싶으면 " \ " 을 기입해 주자.


2단계.
체스는 총 16개의 피스를 사용하며, 킹 1개, 퀸 1개, 룩 2개, 비숍 2개, 나이트 2개, 폰 8개로 구성되어 있다.
검은색 피스는 모두 있었으나, 흰색 피스는 개수가 올바르지 않았다.
동혁이가 발견한 흰색 피스의 개수가 주어졌을 때, 몇 개를 더하거나 빼야 올바른 세트가 되는지 구하는 프로그램을 작성하시오.

첫째 줄에 동혁이가 찾은 흰색 킹, 퀸, 룩, 비숍, 나이트, 폰의 개수가 주어진다. 이 값은 0보다 크거나 같고 10보다 작거나 같은 정수이다.

첫째 줄에 입력에서 주어진 순서대로 몇 개의 피스를 더하거나 빼야 되는지를 출력한다. 만약 수가 양수라면 동혁이는 그 개수만큼 피스를 더해야 하는 것이고, 음수라면 제거해야 하는 것이다.

답: chess = [1, 1, 2, 2, 2, 8]  
 
a = list(map(int, input().split()))
 
for i in range(6):
    print(chess[i] - a[i], end=' ')

chess라는 배열을 만든다. 순서대로 1 /  1 / 2 / 2 / 8 이 들어가 있다. 이후 흰색 킹, 퀸, 룩, 비숍, 나이트, 폰의 개수를 기입받을 a를 정의한다 (list 함수 사용.) 이후 6번(킹 ~ 폰) for문을 돌린다. 개수는 16개여야 한다. 그럼 인덱스 0번부터 chess의 검은색 피스에서 기입받은 흰색 피스 (a)을 빼주면 된다. (즉 기준은 chess이다.)


3단계.
첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.

첫째 줄부터 2 ×N-1번째 줄까지 차례대로 별을 출력한다.

답: n = int(input())
for i in range(1, n):
    print(' '*(n-i) + '*'*(2*i-1))
for i in range(n, 0, -1):
    print(' '*(n-i) + '*'*(2*i-1))

(그거 아시나요? 파이썬에서는 range에서 세 번째 파라마터에 마이너스 값을 넣으면 역순 출력이 가능하다는 사실을)

n을 기입받는다. 예제에서는 별 출력이 홀수개씩 출력이 된다. 고로 2 x N - 1을 이용해서 별을 출력해 준다. 나머지 부분은 공백을 출력하면 된다.


 4단계.
알파벳 소문자로만 이루어진 단어가 주어진다. 이때, 이 단어가 팰린드롬인지 아닌지 확인하는 프로그램을 작성하시오.
팰린드롬이란 앞으로 읽을 때와 거꾸로 읽을 때 똑같은 단어를 말한다.

첫째 줄에 단어가 주어진다.

첫째 줄에 팰린드롬이면 1, 아니면 0을 출력한다.

답: word = list(input())
word_reverse = list(reversed(word))

if word == word_reverse :
    print(1)
else :
    print(0)

파이썬의 강점. 많은 라이브러리 함수가 있다는 것이다. 이 코드는 reversed 함수를 이용한 코드다. 단어를 받고, (리스트로 저장) 이후 다시 그 단어를 리버스 한다. 리버스한 단어를 word_reverse에 넣는다. 이후 똑같으면 1 출력, 아니면 0을 출력.


5단계.
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는?를 출력한다.

답: word = input().upper()
set_word = list(set(word))
count_word = []
for i in set_word:
    count_word.append(word.count(i))
if count_word.count(max(count_word)) > 1:
    print("?")
else:
    index = count_word.index(max(count_word))
    print(set_word[index])

upper라는 함수는 입력받은 알파벳 소문자를 모두 대문자로 바꿔주는 함수이다. append는 추가하는 함수, count 함수는 수를 카운팅 하는 함수이다.


6단계.
첫째 줄에 최대 100글자의 단어가 주어진다. 알파벳 소문자와 '-', '='로만 이루어져 있다.
단어는 크로아티아 알파벳으로 이루어져 있다.

입력으로 주어진 단어가 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.

답: list = ['c=', 'c-', 'dz=', 'd-', 'lj', 'nj', 's=', 'z=']
word = input()

for i in list :
    word = word.replace(i, '*')  
print(len(word))

replace 함수는 문자열을 제거, 추가하는 함수이다. 공백을 *로 바꾸어서 출력하기 위해서 for문을 써준 것이다. 이후 바뀐 word의 길이를 출력하면 된다. (list에는 크로아티아 알파벳을 배열로 정의해 두었다.)


7단계.
그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때문에 그룹 단어이지만, aabbbccb는 b가 떨어져서 나타나기 때문에 그룹 단어가 아니다.
단어 N개를 입력으로 받아 그룹 단어의 개수를 출력하는 프로그램을 작성하시오.

답: group_word = int(input()) #N = group_word

for i in range(group_word) :
    word = input()
    for j in range(len(word)-1) :
        if word[j] == word[j+1] :
            continue
        elif word[j] in word[j+1:] :
            group_word -= 1
            break
print(group_word)

여기에 키포인트는 "연속" 개념이다. 문자가 딱 하나만 나와도 연속으로 생각한다. 먼저 그룹 단어를 입력받는다. (int으로 강제 형변환) 이후 단어의 크기만큼 for문을 돌려준다. 이 for문은 단어를 입력받고 다시 word 길이에서 2만큼 적게 돌아간다. (단어를 딱 1개 받아도 연속으로 생각하기 때문. 이 조건을 안 쓰면 if문을 제대로 쓰기 어려워진다.)

이후 if문을 이용해서 연속과 불연속을 체크해 준다.


8단계.
인하대학교 컴퓨터공학과를 졸업하기 위해서는, 전공평점이 3.3 이상이거나 졸업고사를 통과해야 한다.
치훈이는 깜빡하고 졸업고사를 응시하지 않았다는 사실을 깨달았다.

치훈이의 전공평점을 계산해 주는 프로그램을 작성해 보자.
전공평점은 전공과목별 (학점 × 과목평점)의 합을 학점의 총합으로 나눈 값이다.
(전공표는 a+를 기준으로 4.5부터 시작해서 0으로 떨어진다. (f)
P/F 과목의 경우 등급이 P 또는 F로 표시되는데, 등급이 P인 과목은 계산에서 제외해야 한다.

출력값은 치훈이의 전공평점을 출력한다.

답: rate = 0
scoreSum = 0

rating = {"A+": 4.5, "A0": 4.0, "B+": 3.5, "B0": 3.0, "C+": 2.5, "C0": 2.0, "D+": 1.5, "D0": 1.0, "F": 0.0}

for i in range(20):
    subject, score, grade = input().split()
    if grade == "P":
        continue
    rate += float(score) * rating[grade]
    scoreSum += float(score)
    
print(rate/scoreSum)

파이썬에서는 배열을 정의할 때, 동시에 리스트화까지 가능하다. 위 코드처럼 a+에는 4.5를 기입해 주는 것이다.

어차피 f이면 0점이니깐 따로 정의할 필요는 없다. 그냥 배열에 넣어주면 된다. 문제는 p이다. 그래서 성적에 p가 있는지 아닌지를 확인하는 if문을 넣어야 한다. p이면 그냥 지나가야 하니 continue를 써준다. 이후 점수를 소수점으로 출력해야 해서 float 형변환을 해야 한다. (subject. 즉 과목은 입력 정도만 구현해 주면 된다. 계산엔 직접적인 관여를 하지 않기 때문.)

전공평점은 (학점 곱하기 과목평점)의 합을 학점을 총합으로 나눈 값이다. rate가 학점 곱하기 과목평점이다. 학점의 총합은 scoreSum이다. (이 과정을 20번 해준다....)

결론

구현할 필요가 없는 부분은 무시해도 좋다. 입력만 받아도 되면 입력까지만 구현하고 뒤를 스킵해도 좋다. (일명 꼼수..)

물론 문제 풀이가 위주이기에 이렇게 푸는 것. 실제로 회사에서 알고리즘을 구현할 때는 또 다를 수 있다!

'백준 (코테)' 카테고리의 다른 글

8. [8단계] 제목: 일반 수학 1  (0) 2024.08.16
7. [7단계] 제목: 2차원 배열  (0) 2024.08.15
5. [5단계] 제목: 문자열  (0) 2024.08.13
1~4단계 백준 복습  (0) 2024.08.12
4. [4단계] 제목: 1차원 배열  (0) 2024.08.10