백준 4~5단계 코딩테스트

릿·2023년 2월 17일
0

1. 한수

문제: 어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오.

입력: 첫째 줄에 1,000보다 작거나 같은 자연수 N이 주어진다.

출력: 첫째 줄에 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력한다.

1. 내 풀이

  • 문제 읽는데 시간이 좀 걸렸고, 타입에러를 잡기 위해 계속 ide를 쓸 수 밖에 없는 게 좀 아쉬운 점 같다ㅠ
def solve(a) :
    a = str(a)
    for i in range(len(a)-1) :
        isTrue = False
        step = int(a[0])-int(a[1])
        if int(a[i])-int(a[i+1]) == step :
            isTrue = True
        else :
            isTrue = False
    return isTrue
    
n = int(input())
cnt = 0

for i in range(1, n+1) :
    if len(str(i)) == 1 :
        cnt += 1
    else :
        if solve(i) == True :
            cnt += 1

print(cnt)

2. 다른 사람의 풀이

  • 어떻게 이렇게 짧게 쓸 수 있지 했는데
    생각해보니 한자릿수일 때만 등차수열인 게 아니라 두자릿수일 때도 무조건 등차수열이구나...
  • 그리고 if문을 자바스크립트처럼 한 줄에 쓸 수 있다는 걸 알았다.
n=int(input())
s=0
for i in range(1,n+1):
    l=list(map(int,str(i)))
    if i<100:s+=1
    elif l[0]-l[1]==l[1]-l[2]:s+=1
print(s)

2. 아스키 코드

문제: 알파벳 소문자, 대문자, 숫자 0-9중 하나가 주어졌을 때, 주어진 글자의 아스키 코드값을 출력하는 프로그램을 작성하시오.

입력: 알파벳 소문자, 대문자, 숫자 0-9 중 하나가 첫째 줄에 주어진다.

출력: 입력으로 주어진 글자의 아스키 코드 값을 출력한다.

1. 내 풀이

문자를 아스키코드로 변환할 때는 ord(), 아스키코드를 문자로 변환할 때는 chr()를 사용함

n = input()

print(ord(n))

3. 숫자의 합

문제: N개의 숫자가 공백 없이 쓰여있다. 이 숫자를 모두 합해서 출력하는 프로그램을 작성하시오.

입력: 첫째 줄에 숫자의 개수 N (1 ≤ N ≤ 100)이 주어진다. 둘째 줄에 숫자 N개가 공백없이 주어진다.

출력: 입력으로 주어진 숫자 N개의 합을 출력한다.

1. 내 풀이

sum함수 쓰면 숫자 개수는 필요없는 것 같다.

a = int(input())
li = list(map(int, input()))
print(sum(li))

4. 알파벳 찾기

문제: 알파벳 소문자로만 이루어진 단어 S가 주어진다. 각각의 알파벳에 대해서, 단어에 포함되어 있는 경우에는 처음 등장하는 위치를, 포함되어 있지 않은 경우에는 -1을 출력하는 프로그램을 작성하시오.

입력: 첫째 줄에 단어 S가 주어진다. 단어의 길이는 100을 넘지 않으며, 알파벳 소문자로만 이루어져 있다.

출력: 각각의 알파벳에 대해서, a가 처음 등장하는 위치, b가 처음 등장하는 위치, ... z가 처음 등장하는 위치를 공백으로 구분해서 출력한다.

만약, 어떤 알파벳이 단어에 포함되어 있지 않다면 -1을 출력한다. 단어의 첫 번째 글자는 0번째 위치이고, 두 번째 글자는 1번째 위치이다.

1. 내 풀이

-1이 시도때도 출력되서 isTrue라는 변수를 하나 더 만들어주었다.

li = list(map(str, input()))
compareLi = list(map(str, 'abcdefghijklmnopqrstuvwxyz'))

for i in range(len(compareLi)) :
    isTrue = False
    for j in range(len(li)) :
        if compareLi[i] == li[j] : 
            print(j, end=' ')
            isTrue = True
            break
    if isTrue == False : print(-1, end=' ')

2. 다른 사람의 풀이

천재다... 아스키코드로 품ㅋㅋㅋ
find함수는 원래 못 찾으면 -1을 반환하니까 이 방법도 좋은 것 같다.

s = input()
for i in range(97,123):
    print(s.find(chr(i)), end=' ')

5. 문자열 반복

문제: 문자열 S를 입력받은 후에, 각 문자를 R번 반복해 새 문자열 P를 만든 후 출력하는 프로그램을 작성하시오. 즉, 첫 번째 문자를 R번 반복하고, 두 번째 문자를 R번 반복하는 식으로 P를 만들면 된다. S에는 QR Code "alphanumeric" 문자만 들어있다.

QR Code "alphanumeric" 문자는 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ$%*+-./: 이다.

입력: 첫째 줄에 테스트 케이스의 개수 T(1 ≤ T ≤ 1,000)가 주어진다. 각 테스트 케이스는 반복 횟수 R(1 ≤ R ≤ 8), 문자열 S가 공백으로 구분되어 주어진다. S의 길이는 적어도 1이며, 20글자를 넘지 않는다.

출력: 각 테스트 케이스에 대해 P를 출력한다.

1. 내 풀이

입력값이 3줄에 걸쳐 들어오는데 그걸 생각 못하고 삽질을 하고 있었다.
그리고 개행할 때 앞에 다른 내용 없이 sep='\n'만 쓸 수 있다는 걸 알았다.

n = int(input())

for i in range(n) :
    a, b = input().split()
    a = int(a)
    b = list(map(str, b))

    for j in range(len(b)) :
        for k in range(a) :
            print(b[j], end='')
    print(sep='\n')

2. 다른 사람의 풀이

  • 문자열에 곱셈을 쓸 수 있구나!
  • 문자열 탐색이 s[i]가 아니라 i만 써도 가능하는 걸 알았다.
  • 개행을 할 땐 print()만 써도 가능하구나...
t=int(input())
for _ in range(t):
    n,s=input().split()
    for i in s:
        print(i*int(n),end="")
    print()
profile
항상 재밌는 뭔가를 찾고 있는 프론트엔드 개발자

0개의 댓글