solved.ac Grand Arena #3

solved.ac 그랜드 아레나 #3(Division 2)에 출전해 7문제 중 2문제를 풀어 등록한 사용자 395명 중 168등을 기록했습니다. 스코어보드는 여기에서, 에디토리얼은 여기에서 확인할 수 있습니다.

 30802. 웰컴 키트

A, AC / 6

일단 펜의 개수부터 보겠습니다. N개의 펜을 P로 나눈 몫과 나머지를 구하면 됩니다.

티셔츠의 개수를 보겠습니다. S개의 티셔츠를 T로 나눈 몫과 나머지를 구해봅니다. 만약에 나머지가 0이라면, 나눈 몫만큼만 구매하면 됩니다. 나머지가 0이 아니라면, 결국 한 묶음을 추가로 구매해야 하므로 나눈 몫에서 1개를 더 주문해야 합니다. 모든 사이즈에 대해서 각각 구한 다음, 이 값을 모두 합해주면 됩니다.

저도 온사이트 아레나 가게 해주세요

 30803. 수도꼭지

B, AC +1 / 19

왜 물탱크에 N개의 수도꼭지를 연결하는 걸까요... 수학 시험지에 딴지를 거는 것 같네요. 철수와 영희는 왜 그런 짓을 했는지에 대하여

문제는 저한테 쿼리를 날립니다. 쿼리는 두 가지 중 하나입니다.

  • 쿼리 1, i, xA_{i}을 바꿉니다.
  • 쿼리 2, i는 해당 수도꼭지를 잠그거나 엽니다.

생각해보면, 이 쿼리들은 i번째 수도꼭지만 바꾸고 나머지는 바꾸지 않습니다. 그러면, 이전 쿼리에서 나온 답을 저장해 놓고, 쿼리가 들어올 때마다 이 값만 어떻게 해볼 수 있겠습니다.

제 코드를 여기에 옮겨 보겠습니다.

import sys
n = int(sys.stdin.readline().rstrip())
a = list(map(int, sys.stdin.readline().rstrip().split()))
b = [1 for i in range(len(a))]
o = sum(a)
print(o)
q = int(sys.stdin.readline().rstrip())
for x in range(q):
    query = list(map(int, sys.stdin.readline().rstrip().split()))
    if query[0] == 1:
        if b[query[1]-1] == 0:
            a[query[1]-1] = query[2]
        else:
            o -= a[query[1]-1]
            a[query[1]-1] = query[2]
            o += query[2]
    else:
        if b[query[1]-1] == 0:
            b[query[1]-1] = 1
            o += a[query[1]-1]
        else:
            b[query[1]-1] = 0
            o -= a[query[1]-1]
    print(o)

 30804. 과일 탕후루

C, 시도하지 못함

탕후루 먹고 싶다

뭔가 느낌이 최장 부분 어쩌구 수열을 구하는 것 같았습니다. 그럼 문제가 생깁니다. 저는 최장 부분 수열 같은 걸 구하는 걸 몰랐습니다.

그래서 하나하나 모든 경우의 수를 구해보려고 했는데, 맞았습니다!!를 받고 싶은 제 마음과는 다르게 비효율적인 방법밖에 생각이 나지 않아 포기했습니다. 솔직히 글을 쓰고 있는 지금도 에디토리얼을 보고 있지만 뭔 소린지 모르겠습니다.


오랜만의 아레나 출전이었습니다. 레이팅 계산 공식이 변경되어 A 1310B 995가 되었다가, 이번 대회의 퍼포먼스는 A+ 1517으로 판정이 되었고, 레이팅이 B+ 1157이 되었습니다.

실버 1이지만 구현으로 최강입니다

8월 12일부터 15일까지 4개의 대회에 참가했습니다.

대회에디토리얼SolveRank
제1회 유틸컵 - Chapter 1-4 +8689/466
solved.ac Grand Arena #2에디토리얼2 +45346/1098(Rated)
365/675(All)
제 1회 하이콘 Open Contest에디토리얼3 +4469/235
제3회 고려대학교 MatKor Cup : 2023 Summer Open Contest - Phase 1에디토리얼1 +68162/297(All)

예전보다 문제 푸는 실력이 늘어난 것 같아 행복합니다.

 28453. Previous Level

유틸컵 A, AC / 2 +22

메이플스토리의 만렙이 300이 된 지도 몰랐습니다. 옛날 200 시절밖에 모르는데...

모든 입력은 4개의 구간 중 하나에 속하게 되므로, 조건문 3개를 사용하여 출력하면 됩니다. 한 줄에 출력해야 하기 때문에 print문에서 end=" "을 사용해 출력할 수 있습니다.

 28454. Gift Expire Date

유틸컵 B, AC / +6

문제의 입력이 주어진 현재 날짜보다 늦은지를 검사하면 됩니다. 파이썬의 datetime 모듈을 사용할 수도 있지만, 연도와 월, 일을 순서대로 비교할 수도 있습니다.

 28455. Union Maplestory

유틸컵 C, AC / 2 +32

메이플에 유니온이라는 시스템이 있었군요. 옛날 메이플에는 그런 거 없었는데

일단 입력을 리스트 안에 모두 받아주고, 내림차순으로 정렬해 42개의 요소만 남깁니다. 이후, 캐릭터마다 레벨이 60, 100, 140, 200, 250 이상인지 검사해 줍니다. 이후, 레벨의 합과 검사한 값의 합을 각각 출력하면 됩니다.

 28456. Array Rotation

유틸컵 D, AC / +26

일단 2차원 배열을 입력받아주고, 각 연산마다 하라고 했던 걸 해주면 됩니다. 연산의 첫 자리가 1인 경우 맨 뒤 원소를 없애고 맨 앞으로 삽입합니다. 2인 경우 배열을 회전시켜주면 됩니다.

 28701. 세제곱의 합

GA2 A, AC / 2

1부터 N까지의 수의 합의 제곱과 1부터 N까지의 세제곱의 합이 같다는 사실을 오늘 알았습니다.

문제에서 주어진 대로 구현하면 됩니다. 1부터 N까지의 수의 합은 \frac{N(N+1)}{2}이므로 그대로 구현하면 되고, 1부터 N까지의 세제곱의 합은 1부터 N까지의 수의 합의 제곱과 같다고 했으므로 합의 제곱을 두 번 출력하면 됩니다. 두 값이 같다는 증명은 에디토리얼에 있습니다.

 28702. FizzBuzz

GA2 B, AC +1 / 22

세 개의 입력 중 한 번 이상은 숫자가 그대로 들어옵니다. 아마도요. 그렇지 않으면 이 문제를 풀 수 없을 겁니다.

일단 그렇다는 가정을 하고, 입력 중 숫자를 찾아 문제에서 주어진 규칙에 따라 출력을 해주면 됩니다.

 28444. HI-ARC=?

하이콘 A, AC / 1 +1

HI-ARC=?

문제에서 주어진 그대로 계산을 해 주면 됩니다. 입력을 i라는 리스트로 받았을 때, i[0]i[1]을 곱하고, i[2], i[3], i[4]를 곱한 값을 빼주면 되는 간단한 문제였습니다.

 28445. 알록달록 앵무새

하이콘 B, AC / 1 +9

앵무새는 귀엽습니다.

문제의 조건에 따라, 나올 수 있는 조합은 최대 16개입니다. 서로 다른 색의 개수에 따라 조건문을 만들 수도 있습니다. 하지만 더 쉬운 방법을 찾을 것입니다. 늘 그랬듯이.

우선 모든 색 조합을 구하고, 파이썬의 set 자료형을 사용해 중복을 제거합니다. 정렬하고 출력해 주면 됩니다.

 28446. 볼링공 찾아주기

하이콘 C, AC / 2 +34

보자마자 '이건 딕셔너리다' 싶은 문제였습니다.

딕셔너리를 사용하면 문제가 간단해집니다. 1번 입력을 받으면 d[w] = x 로 값을 저장하고, 2번 입력을 받으면 d[w]를 출력하면 됩니다.

그렇대요
저런

 28682. 재우야 임관하자

MatKor A, AC / 3 +68

아마도 처음으로 풀어보는 인터랙티브 문제일 겁니다.

몬티홀 문제라는 매우 유명한 문제가 있습니다.

세 개의 문 중에 하나를 선택하여 문 뒤에 있는 선물을 가질 수 있는 게임쇼에 참가했다. 한 문 뒤에는 자동차가 있고, 나머지 두 문 뒤에는 염소가 있다. 이때 어떤 사람이 예를 들어 1번 문을 선택했을 때, 게임쇼 진행자는 3번 문을 열어 문뒤에 염소가 있음을 보여주면서 1번 대신 2번을 선택하겠냐고 물었다. 참가자가 자동차를 가지려할 때 원래 선택했던 번호를 바꾸는 것이 유리할까?

결론은 '바꾸는 것이 유리하다'입니다. 선택을 바꾸지 않았을 때의 당첨 확률은 \frac{1}{3}, 바꿨을 때의 당첨 확률은 \frac{2}{3}입니다.

인터랙티브 문제는 출력을 한 이후 sys.stdout.flush() 등으로 출력 버퍼를 flush해야 합니다. 바부같이 import sys를 적지 않아 두 번이나 틀렸습니다를 받았습니다.


그랜드 아레나 2에 등록하고 출전해 퍼포먼스는 S+ 1927, 레이팅은 B 866A 1310이 되었습니다.

solved.ac Grand Arena #1

solved.ac가 개최하는 첫 경쟁 프로그래밍 대회, 그랜드 아레나 #1에 참가했습니다.

스코어보드는 여기에서, 에디토리얼은 여기에서 확인할 수 있습니다. 저는 총 3문제를 풀고, 총 패널티 -138로 등록한 사용자 1,362명 중 285등을 기록했습니다.(Rated 285/1,362 | All 302/847)

 28431. 양말 짝 맞추기

A, AC / 10

양말 짝 맞추기입니다. 마치 항상 짝이 안 맞는 제 양말을 보는 것 같았습니다.

입력된 숫자 중 '홀수 개'인 숫자가 있다면, 그 숫자는 반드시 짝이 맞지 않게 됩니다. 그렇다면 그 숫자가 답이 됩니다.

에디토리얼에 따르면, 모든 입력을 XOR하면 답이 된다고 합니다.

 28432. 끝말잇기

B, AC +2 / 36

정답은 ? 앞의 문자열의 마지막 글자로 시작해야 하고, ? 다음 문자열의 첫 글자로 끝나야 합니다. 그리고, 단어는 중복될 수 없기 때문에 같은 문자열이 나오지 않는지도 검사해줘야 합니다.

N이 1개거나 2개인 경우에 대해 예외처리를 하지 않아서 런타임 에러를 두 번이나 받았습니다.

 28438. 행렬 연산 (행렬 계산하기)

H, AC / 52

작년 대학 수학 시간에 잠깐 배웠던 행렬을 이용해야 하는 문제가 나왔습니다. 이 문제에 나오는 연산은 두 개 뿐입니다. r행에 v를 더하거나, c열에 v를 더하는 것입니다. rc열의 수는 r행에 더해진 수와 c열에 더해진 수를 합한 값이 될 것입니다.


이번 아레나는 등록만 하고 문제를 풀지 않은 사람이 많아서, 퍼포먼스가 매우 높은 SS 2066으로 판정이 되었고, 레이팅은 Unrated 0B 866이 되었습니다.

【PS의 아이】

6월 17일부터 7월 6일까지 5개의 대회에 참가했습니다.

대회에디토리얼SolveRank
송도고 코드마스터 2023 Open Contest에디토리얼2 +0:31157/419
FunctionCup 2023 Open Contest-1 +55105/142
강원도 대학생 코딩 경진대회 Open Contest-1 +7089/138
UCPC 2023 예선 Open Contest에디토리얼1 +114179/227
2023 대구소프트웨어고 프로그래밍 경진대회 (DPC 2023) Open Contest-4 +15840/224

5월 중~하순에 7개의 대회에 출전(해서 1문제씩 긁은)한 후기는 여기서 볼 수 있습니다.

이 중 DPC는 6문제 중 무려 4문제를 풀어 내며 PS 인생 역사상 최대의 성과를 기록했습니다.

 28235. 코드마스터 2023

CodeMaster A, AC / 1 +0:10

간단한 구현 문제입니다. if else를 적당하게 써 주면 됩니다.

 28236. 점심시간 레이스

CodeMaster B, AC / 1 +0:21

학교 다니던 시절의 저를 생각나게 하는 문제였습니다. 수업에는 관심 없고 급식에만 관심이 있었거든요(제가 다녔던 고등학교는 급식이 맛있는 편이었습니다). 송도고의 급식실은 던전처럼 생겼군요 학생들은 반드시 가장 빠른 경로로 움직인다고 했기 때문에, 반드시 오른쪽 끝으로 간 다음 계단을 이용해 내려갈 것입니다. 3층에서 1층으로 신뢰의 도약을 한다는 선택지 같은 건 없습니다. 그렇다면, 오른쪽 계단까지 가는 길이와, 계단을 통해 1층으로 내려가는 길이를 더해 이 값이 가장 작은 반(들) 중 번호가 가장 작은 반의 번호를 출력하면 됩니다.

 28270. Marked-Numbered

FunctionCup MN, PAC / 1점 / 1 +55

사실 함수컵에서 이 문제가 없었다면 단 한 문제도 맞히지 못했을 겁니다.

함수컵의 문제. 난이도가 골드 5부터 시작한다.

이 문제의 서브태스크 1은 문제에서 주어진 예제만 들어옵니다. 예제 입력만 구분해 출력하도록 했습니다. 나중에 제 실력이 더 늘어나게 된다면 다시 풀어보겠습니다.

 28281. 선물

강원도 대학생 코딩 경진대회 A, AC / 1 +70

연속된 이틀의 비용을 합친 값이 가장 작은 걸 구한 후, 거기에 X를 곱해 출력하면 됩니다.

 28295. 체육은 코딩과목 입니다

UCPC A, AC / 2 +114

UCPC 예선은 보통 A번 문제가 가장 쉽습니다. 그래서 일단 A번부터 긁었습니다.

학생들은 우향우를 하거나, 뒤로 돌거나, 좌향좌를 합니다. 10개의 입력을 받은 뒤, 마지막에 학생들은 어디를 보고 있는지를 출력하면 되는 쉬운 문제였습니다. 북쪽부터 0, 동쪽을 1, 남쪽을 2, 서쪽을 3으로 정한 뒤 각 입력에 따라 방향을 바꿔줬습니다.

이후 에디토리얼을 보았는데, “좌향좌”를 오른쪽으로 270도 도는 것으로 생각할 수 있습니다. 이렇게 되면 문제 풀이가 더 간단해집니다.

에디토리얼에 따르면, 출제자의 정해는 다음과 같습니다.

print("NESW"[sum(int(input()) for _ in range(10)) % 4])

여담이지만, UCPC에 출전하는 팀 이름이 너무 웃긴게 많습니다. 실수로물을너무많이줘버린나의라임오렌지과대성장트리 라던가, 멕시코시티노점상에서타코사먹는윤창기 라던가요.

 28289. 과 조사하기

DPC A, AC / 1 +13

숫자 세 개씩이 들어옵니다. 첫 번째 숫자가 1이라면 이 사람은 아무 과에도 속할 수 없습니다. 그렇지 않다면, 이 사람은 반드시 어느 과에 속하므로 두 번째 숫자에 따라 적당하게 넣어주면 됩니다.

 28290. 안밖? 밖안? 계단? 역계단?

DPC B, AC / 1 +16

문자열을 입력받고, 문제에서 제시한 문자열인지 확인하기만 하면 됩니다.

 28292. 개미 수열

DPC C, AC / 3 +94

읽고 말하기 수열, 개미 수열이라고 하는 수열에 대한 문제였습니다. 이 수열의 최대 100번째 수를 무턱대고 구하려고 코드를 짜고 돌려봤습니다. 당연히 시간 초과가 났습니다. 시간 제한이 1초인데, 나중에 이 글을 쓰는 시점에서 다시 돌려보니까 20분이 넘어가고 있었습니다. 뭔가 다른 방법이 필요했습니다.

당연히 이걸 통으로 구해서 푸는 문제는 아닐 것 같아 수열의 처음 15개를 보고 있는데, 수열의 어디에도 4는 나오지 않았습니다. 그래서 혹시 1 아니면 2 아니면 3 아닌가? 싶은 생각이 들었고, 역시나였습니다.

이 수열의 2번째 수까지는 1밖에 나오지 않습니다. 5번째 수까지는 1과 2만 나옵니다. 그 이외의 경우에는 3까지만 나온다고 추측하고, 입력에 따라 1 또는 2 또는 3을 출력하는 코드를 작성했더니 맞았습니다!!를 받았습니다.

 28293. 자릿수

DPC E, AC / 2 +35

문제는 ab승의 자릿수를 구하는 것이었습니다. b \times \log_{10}\left ( a \right ) + 1 을 하면 구할 수 있다는 것을 어딘가에서 봐서 기억하고 있었습니다(대체 이걸 왜 알고 있는 거지). 그래서 그대로 구현했고, 맞았습니다!!를 받았습니다.

그런데, 대회 종료 이후 문제에 실수 오차와 관련된 오류가 있다는 의견이 있었고, 이 글을 작성 중인 현재는 채점 준비 중 이 걸려 있습니다. 처음으로 풀었던 Gold IV 문제였는데, 조금 아쉽긴 합니다.

실수를 다루는 문제에서는 컴퓨터에서 발생할 수 있는 오차를 항상 고려해야 합니다. 관련해서는  shiftpsh 님의 글이 도움이 됩니다.


언젠가는 더 어려운 문제도 풀 수 있게 되겠죠...? 대회 올솔도 하고 뭐 그런... 날이 오긴 할 겁니다.

맥에서 런치패드 안지워지는 앱 지우기

Steam에서 게임을 삭제해도 Launchpad에 아이콘이 남아있는 경우가 있습니다.

분명히 스팀에서 삭제를 하고 환불도 했는데, Launchpad에서 Option 키를 눌러도 삭제할 수 없습니다.

삭제 버튼이 활성화되지 않은 게임들.

Macintosh HD → Applications 에 들어가서 직접 지우는 방법을 시도했는데, 여기서도 보이지 않았습니다.

여기 없어요

Macintosh HD → User → 어쩌구 → Application 에서 삭제할 수 있었습니다.

요기잉네