[Codeforces] Good Bye 2021: 2022 is NEAR 참가 후기

yoxxin·2021년 12월 29일
0

codeforces

목록 보기
1/2

A. Integer Diversity

-100 <= i <= 100 범위 정수 i로 이루어진 배열이 주어지면,
각 원소에 -를 붙이던지 해서 배열안에 있는 정수들이 서로 다른경우의 개수중 최댓값을 구하는 문제였다.
예를 들어 [1, 1, 2, 2] 이 주어지면 [−1,1,2,−2] 로 변환할 수 있고,
최댓값은 4이다.

t = int(input())

for _ in range(t):
    num = dict()
    for i in range(-100,101):
        num[i] = 0
    n = int(input())
    a = list(map(int,input().split()))
    # 0만 존재할 때, print(1)
    if len(set(a)) == 1 and list(set(a))[0] == 0:
        print(1)
        continue
    for i in a:
        num[i] += 1
    numOver2 = 0
    for i in range(-100,101):
        if num[i] >= 2 and num[-i] == 0:
            numOver2 += 1
    print(len(set(a))+ numOver2)

배열이 0으로만 이루어진 경우를 제외하고,
최댓값은

len(set(arr)) + 2개 이상인 원소들의 개수

규칙은 잘 구했는데..

num = [0] * 201 # -100 <= ai <= 100

숫자의 개수를 구하는 num을 리스트로 선언하는 바람에 i를 음수로 바꾸는 과정에서
인덱스를 어떻게 변환해야할지 헷갈려서 시간을 많이 날리고 WA도 많이 받아버렸다..
수학머리가 답없는 수준이다ㅠㅠ

그래도 나중에 dictionary로 선언하여 해결.

B. Mirror in the String

문자가 주어지면 그 문자의 0번 인덱스 부터 i 번째 index까지 대칭하여 나오는 문자 중
사전적으로 제일 먼저오는 문자를 찾는 문제이다

index를 늘려가다가 i번째 알파벳이 i-1번째 알파벳보다 아스키코드가 크면 멈추고 대칭출력

대신 처음에 같은 문자가 2개이상 반복되면 바로 출력해준다.

t = int(input())

for _ in range(t):
    n = int(input())
    a = input()
    # 문자길이가 1이면 바로 대칭출력
    if len(a) == 1:
        print(a+a)
        continue
    # 처음에 같은 문자가 2개이상 반복되면 바로 출력
    if a[0] == a[1]:
        print(a[0] + a[0])
        continue
    index = len(a)-1
    for i in range(1,len(a)):
    	# 아스키코드가 더 크면 break
        if a[i] > a[i-1]:
            index = i-1
            break
    print(a[:index+1]+a[index::-1])

처음에 같은문자 2개이상 반복될 때 바로 출력해주는 조건을 찾기가 어려웠다ㅠㅠ

사실 처음엔 t <= 10000 이고, 케이스로 주어지는 모든 문자 길이의 합 n이 n <= 10000 이라서
brute-force로 모든 경우를 구하고 비교하는 식으로 구현했는데, 시간초과났다.
제한시간이 1초고, 최대 경우의 수가 1억이라서 기대했지만.. 어림도없지

결과

2솔. 수많은 WA와 늦은 AC 시간 덕에 처참한 성적..

그래도 재밌었다😁

0개의 댓글