코딩 자산관리/Coding Test

[Codeforces Round #696 (Div. 2)] A. Puzzle From the Future

은행장 노씨 2021. 1. 20. 14:53

1. 코드포스에 참여한 동기

2020년 1월 19일 어제!

코드포스 대회를 앞으로 꾸준히 참여하기로 마음먹었다.

오후 11:35분부터 2시간 동안 Codeforces Round #696 (Div. 2)에 참여하였다.

 

나는 백준을 주로 푼다.

코드포스는 문제가 영어로 돼 있어서 도전할 용기가 안 났다.

한글 문제도 제대로 못 푸는데 영어로 된 문제는 더 막막할 것이라고 생각했다.

심지어 시간제한도 있어서 나에게는 어려운 도전이었다.

 

코드포스를 시작한 동기는 친구의 권유였다.

그리고 백준 티어가 골드로 올랐다. 히히 코드포스를 하면 내 실력이 더 늘 것 같았다.

 

시작!


2. 문제 A. 풀이

 

 처음에 문제가 영어라 이해하기 힘들었다. 영어 공부 열심히 해야겠다.

간단하게 문제를 설명해보겠다. 밑에 그림을 보면서 차근차근 따라가 보자. 문제 자체는 쉬웠다.

 

길이가 같은 a, b의 데이터가 들어온다. a와 b를 더한 게 c이다. d는 연속되는 같은 숫자열을 없앤 것이다.

예시를 하나 더 보겠다. a와 b를 더하니 22111이 나왔다. 여기에서 연속된 숫자들은 없애니 21이 나온다.

(노란선과 초록선은 연속된 숫자들을 각각 표시한 것이다.) 

과정이 이해가 갔으면 이제 문제를 보자.

 

a를 잃어버렸다! 주어진 건 a, b의 길이와 데이터 b 뿐이다. 주어진 것을 활용하여 d값이 최대가 되는 a 값을 구하라! 

 

내가 생각하는 중요한 점은 d가 최대가 되기 위해

1. 1을 더한다.

2. 겹치지 않는다.

위 두 가지를 우선순위로 두고 식을 작성했다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def switch(n):
    if n == 0:
        return 1
    else:
        return 0
 
for i in range(int(input())):
    lengh = int(input())
    a = list(map(int, input()))
    b = [1 for i in range(lengh)]
    c = [0 for i in range(lengh)]
 
    c[0= a[0+ b[0]
 
    for i in range(1,lengh):
        c[i] = a[i] + b[i]
        if c[i] == c[i - 1]:
            b[i] = switch(b[i])
            c[i] = a[i] + b[i]
            
    for i in b:
        print(i, end="")
    print()

 

나는 a와 b를 바꿔서 식을 작성했다.

b는 1로 다 채운다.

자릿수 a, b 두 개를 더해서 c 리스트를 채운 다음에 c 전 값과 연속되어 있는지 확인한다.

연속되어 있으면 b를 0이면 1, 1이면 0으로 바꾼다.(함수를 따로 만들었다.)

 

맞았지만 조금 헤매는 바람에 시간이 많이 걸렸다.


3. 느낀점

 영어라 많이 당황했다. 앞으로 차분하게 해야겠다. 문제 밑에 note가 있었다. 문제를 잘 풀이해줘서 이해하는 데 큰 도움이 됐다.

다음부터 밑에 노트를 꼼꼼하게 보고 이해를 해야겠다고 생각했다.

확실이 대회를 하니까 내가 코딩을 느릿느릿한다는 느낌이 들었다.

더 빠르고 확실하게 할 수 있도록 연습해야겠다.

 

20일 오전에 들어가 보니 390점을 얻었다고 했다! 오예!

다음번 대회에는 1문제를 혼자 힘으로 푸는 것이 목표다.