- 문제 : https://www.acmicpc.net/problem/2870

 

문제 이해 

- 여러 개의 문자열이 주어지는데, 그때마다 숫자인 부분들을 모두 모아서 오름차순으로 출력하는 문제다.

- 주어진 문자열(word)를 선형 탐색하면서 숫자인 부분들만 temp로 모으고, 만약 다음 원소가 알파벳이라면 해당 숫자는 저장한 뒤, temp를 초기화한다. 

- 여기서 주의해야할 점은 가장 끝 원소도 명시적으로 처리(i == len(word) - 1) 해줘야 하고, 그때 이전에 입력된 숫자가 있는지 확인(temp != '')하는 것이다. 

- 위 로직으로 숫자들을 answer에 모두 모았으면 오름차순 정렬한 뒤 하나씩 출력해주면된다.

 

정답 풀이 

answer = []
for _ in range(int(input())):
    temp = '' # 그때그때마다 숫자들 모으는 용도
    word = list(input())
    for i in range(len(word)):
        if word[i].isdigit():
            temp += word[i]
        if not word[i].isdigit() or i == len(word) - 1:
            if temp != '':
                answer.append(int(temp))
                temp = '' 

answer.sort()
for i in range(len(answer)):
    print(answer[i])

- 문제 : https://www.acmicpc.net/problem/20920

 

문제 이해 

- 입력되는 단어 중에 길이 m 이상의 단어들을 저장한 뒤 출력하는데 다음과 같은 규칙으로 출력해야 한다.

  1. 가장 자주 나오거나

  2.횟수가 같다면 문자의 길이가 긴 순서로

  3. 길이마저 같다면 알파벳 순서로 단어들을 출력하는 문제다. 

- 단어 개수를 세기 위해 numbers라는 딕셔너리를 활용하고, 각 key에 대한 value는 [횟수, 길이]로 설정했다. 

- 위의 순서대로 sorted()를 이용해 다중 정렬을 한 뒤, 각 단어들을 정렬된 순서대로 출력하면 된다. 

# 다중 정렬은 (기준 컬럼1, 기준 컬럼2,,,)으로 설정하면 된다
# 만약 특정 기준 컬럼이 기존과 반대되는 정렬 방식을 사용한다면 앞에 '-'를 붙여주면 된다.
result = sorted(numbers.items(), key = lambda x : (-x[1][0], -x[1][1], x[0]))

- 풀이로직은 알았지만, rstrip()을 하지 않아 틀린 출력을 해서 약간 헤맸던 문제다. 

 

정답 풀이 

import sys
input = sys.stdin.readline

n, m = map(int, input().rstrip().split())

numbers = {} # [횟수, 길이]
for _ in range(n):
    word = input().rstrip()
    k = len(list(word))
    if  k >= m:
        if word in numbers.keys():
            numbers[word][0] += 1
        else:
            numbers[word] = [1, k]
            
result = sorted(numbers.items(), key = lambda x : (-x[1][0], -x[1][1], x[0]))
for i in range(len(result)):
    print(result[i][0])

- 문제 : https://www.acmicpc.net/problem/11655

 

문제 이해 

- 주어진 문자열에서 알파벳들을 13칸씩 미루어서 새로운 문자열을 만드는 문제다.

- 제약사항으로는 소문자는 소문자로 미루고, 대문자는 대문자로 미뤄야 한다. 

- 알파벳의 order를 가지고 풀면 되지만, 제약사항이 있기 때문에 그 부분에 유의해서 풀어야한다. 

- 처음에는 일일히 조건을 나누어서 풀었지만, 그럴 필요없이 아래처럼 간단하게도 풀 수 있다. 

 

풀이 로직 

- 소문자의 order를 13칸 미룬다음 혹시나 z(소문자 끝)의 범위를 넘어가는 것에 대비해 97을 빼준 뒤 26으로 나눈 나머지를 97에 더한다

- 대문자도 마찬가지로 13칸 미룬다음 Z(대무낮 끝)의 범위를 넘어가는 것에 대비해 65를 빼준 뒤 26으로 나눈 뒤 나머지를 65에 더하면 된다.

- 숫자나 띄어쓰기는 그냥 출력해주면 된다.

정답 풀이 

arr=input()
ans=''
for i in arr:
    if i.islower():
        print(chr(97+(ord(i)+13-97)%26), end='')

    elif i.isupper():
        print(chr(65+(ord(i)+13-65)%26), end='')

    else:
        print(i,end='')

+ Recent posts