HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
Line 코딩테스트 (03.26)

Line 코딩테스트 (03.26)

3.26(토), 프로그래머스, 3시간 6문제
 
 
4개풀(1,3,4,5)
2번 문제 잘못읽어서, 시간 투자 했지만 다 나가리 됨
 
1은 정규식문제, 정규식 사용하기 까다로워서 맞는지 모르겠음
3번은 맞았을 가능성 높
4번은 너무 쉽게 풀려서 흠.. 엣지케이스 더 검사해봐야할 듯
5번은 예제만 맞춘건지.. 자신 없음
 
6번 문제 읽지도 못함
1.로그 (정규식문제, 정규식 사용하기 까다로워서 맞는지 모르겠음)

문제 설명

당신은 로그 수집 프로그램을 만들게 되었습니다.특정 조건들을 만족한 로그만을 수집해야 하며 그 외의 로그는 수집하지 않아야 합니다.
조건은 다음과 같습니다.
  • 로그는 "team_name : t application_name : a error_level : e message : m" 형식이어야 합니다.
    • t, a, e, m은 알파벳 소문자 혹은 알파벳 대문자로만 이루어진 길이 1 이상의 문자열입니다.
    • team_name, application_name, error_level, message, :, t, a, e, m는 한 칸의 공백으로 구분되어 있어야 합니다.
  • 로그의 길이는 100 이하여야 합니다.
로그 수집 프로그램으로 분석할 로그들이 담긴 문자열 배열 logs가 매개변수로 주어졌을 때, logs에 담긴 로그 중 수집하지 않는 로그의 개수를 return 하도록 solution 함수를 완성해주세요.

제한사항

  • 1 ≤ logs의 길이 ≤ 100
    • 1 ≤ logs의 원소 길이 ≤ 200
    • logs의 원소는 알파벳, 숫자, 공백, 특수 문자로 이루어져 있습니다.

입출력 예

logs
result
["team_name : db application_name : dbtest error_level : info message : test", "team_name : test application_name : I DONT CARE error_level : error message : x", "team_name : ThisIsJustForTest application_name : TestAndTestAndTestAndTest error_level : test message : IAlwaysTestingAndIWillTestForever", "team_name : oberervability application_name : LogViewer error_level : error"]
3
["team_name : MyTeam application_name : YourApp error_level : info messag : IndexOutOfRange", "no such file or directory", "team_name : recommend application_name : recommend error_level : info message : RecommendSucces11", "team_name : recommend application_name : recommend error_level : info message : Success!", "   team_name : db application_name : dbtest error_level : info message : test", "team_name     : db application_name : dbtest error_level : info message : test", "team_name : TeamTest application_name : TestApplication error_level : info message : ThereIsNoError"]
6

입출력 예 설명

입출력 예 #1
  1. "team_name : db application_name : dbtest error_level : info message : test"
      • 형식에 맞는 로그입니다.
  1. "team_name : test application_name : I DONT CARE error_level : error message : x"
      • application_name 내용에 I DONT CARE이 들어가 있습니다. 공백이 들어가면 안 되므로 수집하지 않는 로그입니다.
  1. "team_name : ThisIsJustForTest application_name : TestAndTestAndTestAndTest error_level : test message : IAlwaysTestingAndIWillTestForever"
      • 형식은 맞지만 로그의 길이가 100을 넘어가므로 수집하지 않는 로그입니다.
  1. "team_name : oberervability application_name : LogViewer error_level : error"
      • message 부분이 누락되어 있으므로 수집하지 않는 로그입니다.
따라서, 수집하지 않는 로그는 총 3개이므로 3을 return 하면 됩니다.
입출력 예 #2
  1. "team_name : MyTeam application_name : YourApp error_level : info messag : IndexOutOfRange"
      • message가 들어가야 할 부분에 e가 빠진 messag가 들어가 있으므로 수집하지 않는 로그입니다.
  1. "no such file or directory"
      • 형식에 전혀 맞지 않으므로 수집하지 않는 로그입니다.
  1. "team_name : recommend application_name : recommend error_level : info message : RecommendSucces11"
      • message 내용에 숫자가 들어있으므로 수집하지 않는 로그입니다.
  1. "team_name : recommend application_name : recommend error_level : info message : Success!"
      • message 내용에 특수문자가 들어있으므로 수집하지 않는 로그입니다.
  1. " team_name : db application_name : dbtest error_level : info message : test"
      • 가장 앞부분에 공백이 있으므로 수집하지 않는 로그입니다.
  1. "team_name : db application_name : dbtest error_level : info message : test"
      • team_name 다음에 5개의 공백이 연속해서 들어오므로 수집하지 않는 로그입니다
  1. "team_name : TeamTest application_name : TestApplication error_level : info message : ThereIsNoError"
      • 형식에 맞는 로그입니다.
따라서, 수집하지 않는 로그는 총 6개이므로 6을 return 하면 됩니다.
2 부서진키보드 (, 문제 조건을 잘못 읽어서 풀었지만 전부 틀림)

문제 설명

부서진 키보드가 있습니다. 부서진 키보드는 공백을 입력하기 위한 스페이스바와 스페이스바 외의 다른 n개의 키만 사용이 가능합니다.예를 들어 n이 4고 l, i, n, e 4개의 키를 사용할 수 있다고 했을 때, "line in line", "in    n          in"과 같은 문장을 만들 수 있습니다.알파벳 대문자를 만들려면 shift키와 해당 알파벳의 소문자 키가 필요합니다.예를 들어, "L I N e"을 완성하려면 shift, l, i, n, e 이렇게 5개의 키가 필요합니다.
당신은 이 부서진 키보드로 주어진 문자열 배열에 있는 문자열을 완성하면 완성한 문자열의 길이만큼 점수를 받는 게임을 하려고 합니다.예를 들어, "coding is fun"이라는 문자열을 완성하면 13점을 얻을 수 있습니다.단, 완성된 문자열 속에 알파벳 대문자가 있을 경우 알파벳 대문자 개수만큼 1점씩 추가로 점수를 얻을 수 있습니다.예를 들어, "COding is fun"이라는 문자열을 완성하면 15(= 13 + 2)점을 얻을 수 있습니다.문자열을 완전히 완성시키지 못하면 점수를 얻을 수 없습니다.예를 들어, "abcde"라는 문자열을 "abc"까지만 완성하면 점수를 얻을 수 없습니다.
여러 개의 문자열을 담은 문자열 배열 sentences와 스페이스바 외에 사용 가능한 키의 개수를 나타내는 정수 n이 매개변수로 주어집니다. 이때, 얻을 수 있는 최대 점수를 return 하도록 solution 함수를 완성해주세요. 단, 완성할 수 있는 문자열이 없을 경우 0을 return 해주세요.

제한사항

  • 1 ≤ sentences 길이 ≤ 15
    • 1 ≤ sentences의 원소 길이 ≤ 100,000
    • sentences의 원소는 알파벳과 공백으로 이루어져 있습니다.
    • sentences의 원소는 항상 알파벳으로 시작하여 알파벳으로 끝납니다.
      • 예를 들어, ["a ", " A ", " A"]와 같은 원소는 주어지지 않습니다.
  • 1 ≤ n ≤ 27

입출력 예

sentences
n
result
["line in line", "LINE", "in lion"]
5
20
["ABcD", "bdbc", "a", "Line neWs"]
7
12

입출력 예 설명

입출력 예 #1
문자열
필요한 키
점수
"line in line"
l, i, n, e
12
"LINE"
shift, l, i, n, e
8
"in lion"
l, i, n, o
7
사용할 키로 l, i, n, e, o를 고르면 첫 번째와 세 번째 문자열을 완성해 19점을 얻을 수 있습니다.하지만, l, i, n, e, shift를 고르면 첫 번째와 두 번째 문자열을 완성해 20점을 얻을 수 있습니다.따라서 20을 return 해야 합니다.
입출력 예 #2
문자열
필요한 키
점수
"ABcD"
shift, a, b, c, d
7
"bdbc"
b, c, d
4
"a"
a
1
"Line neWs"
shift, l, i, n, e, w, s
11
사용할 키로 shift, l, i, n, e, w, s를 고르면 네 번째 문자열을 완성해 11점을 얻을 수 있습니다.하지만, shift, a, b, c, d를 고르면 첫 번째, 두 번째, 세 번째 문자열을 완성해 12점을 얻을 수 있습니다. (7개까지 키를 사용할 수 있지만 5개로도 충분히 3개의 문자열을 완성할 수 있습니다.)따라서 12를 return 해야 합니다.
3 재택근무 (파싱 및 필터링, 맞았을 가능성 높다)

문제 설명

어떤 회사에서 담당 업무에 따라 사원 몇 명을 재택근무로 전환하려 합니다. 업무는 재택 가능한 업무, 출근해야 할 업무 두 가지 종류가 있습니다. 어떤 사원의 업무가 재택 가능한 업무로만 이루어져 있다면, 그 사원은 재택근무 대상자입니다.
회사에는 1번부터 num_employees번까지 각각 다른 사원 번호를 가진 num_employees명의 사원들이 있습니다. 회사의 사원들은 num_teams개의 팀으로 나뉘어 있으며, 사원마다 소속된 팀 번호가 있습니다. 팀마다 최소 한 명은 출근해야 합니다. 만약 어떤 팀에서 팀원 모두가 재택근무 대상자일 때, 사원 번호가 가장 빠른 사람이 출근하기로 했습니다. 이에 해당하지 않는 재택근무 대상자들은 재택근무를 하게 됩니다. 당신은 재택근무를 하게 될 사원의 번호를 구하려 합니다.
다음과 같은 업무와 사원들의 정보가 있을 때의 예시를 들어보겠습니다.
재택 가능한 업무: development marketing hometask
출근해야 할 업무: recruitment education officetask
사원 번호
소속 팀 번호
담당 업무
1
1
development hometask
2
1
recruitment marketing
3
2
hometask
4
2
development marketing hometask
5
3
marketing
6
3
officetask
7
3
development
  • 재택 가능한 업무만 하는 사원은 (1,3,4,5,7) 5명입니다.
  • 1,3번 팀은 출근하는 팀원이 있지만 2번 팀은 모두 재택근무 대상자입니다. 그러므로, 2번 팀에서 사원 번호가 가장 빠른 3번 사원은 출근해야 합니다.
  • 재택근무를 하게 될 사원은 (1,4,5,7) 4명입니다.
팀의 개수를 나타내는 정수 num_teams, 재택 가능한 업무들을 나타내는 문자열 배열 remote_tasks, 출근해야 할 업무들을 나타내는 문자열 배열 office_tasks, 사원들의 정보를 1번 사원부터 순서대로 나타내는 문자열 배열 employees가 매개변수로 주어집니다. 재택근무를 하게 될 사원들의 번호를 정수 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해 주세요. 최소 한 명 이상 재택근무를 하게 될 사원이 존재하는 경우만 주어집니다.

제한사항

  • 1 ≤ num_teams ≤ 10
  • 1 ≤ remote_tasks의 길이 ≤ 100
  • 3 ≤ remote_tasks의 원소의 길이 ≤ 20
  • 1 ≤ office_tasks의 길이 ≤ 100
  • 3 ≤ office_tasks의 원소의 길이 ≤ 20
  • remote_tasks와 office_tasks는 중복되는 원소가 나타나지 않으며, 서로 중복되는 원소가 없습니다.
  • remote_tasks와 office_tasks의 원소는 알파벳 소문자로만 이루어져 있습니다.
  • num_teams < employees의 길이 = num_employees ≤ 100
  • employees의 원소는 "team_number task_list" 형태의 문자열입니다. team_number는 해당 사원의 팀 번호를 나타내고, task_list는 해당 사원의 담당 업무를 나타내는 문자열입니다.
    • 1 ≤ team_number ≤ num_teams
    • 1~num_teams의 각각의 팀에는 적어도 한 명 이상 소속된 팀원이 있습니다.
    • 모든 사원은 최소 1개 ~ 최대 40개의 업무를 담당합니다.
    • task_list 는 담당 업무를 하나의 공백으로 구분해 담고 있습니다. 반드시 remote_tasks, office_tasks 둘 중 하나에 나타난 업무만 담겨있습니다.
    • task_list 에는 중복된 원소가 나타나지 않습니다.

입출력 예

num_teams
remote_tasks
office_tasks
employees
result
3
["development","marketing","hometask"]
["recruitment","education","officetask"]
["1 development hometask","1 recruitment marketing","2 hometask","2 development marketing hometask","3 marketing","3 officetask","3 development"]
[1,4,5,7]
2
["design"]
["building","supervise"]
["2 design","1 supervise building design","1 design","2 design"]
[3,4]

입출력 예 설명

입출력 예 #1
  • 문제 예시와 동일합니다.
입출력 예 #2
재택 가능한 업무: design
출근해야 할 업무: building supervise
사원 번호
소속 팀 번호
담당 업무
1
2
design
2
1
supervise building design
3
1
design
4
2
design
  • 재택 가능한 업무만 하는 사원은 (1,3,4) 3명입니다.
  • 1번 팀은 출근하는 팀원이 있지만 2번 팀은 모두 재택근무 대상자입니다. 그러므로, 2번 팀에서 사원 번호가 가장 빠른 1번 사원은 출근해야 합니다.
  • 재택근무를 하게 될 사원은 (3,4) 2명입니다.
4 표편집 (dp, 너무 쉬워서 맞는지 헷갈림)

문제 설명

표 편집 프로그램을 통해서 셀의 너비를 원하는 대로 조절하려고 합니다.아래 그림의 위쪽 셀들은 초기 상태의 셀들이며, 초기 상태 셀들의 너비를 화살표 아래쪽 셀들의 너비처럼 조절하려고 합니다.
notion image
셀의 너비는 셀끼리 인접한 경계선을 움직여서 조절합니다. 한쪽 셀의 너비를 줄이면 그만큼 인접한 셀의 너비가 늘어납니다.모든 초기 셀의 너비는 1이 될 때까지 줄일 수 있지만, 셀을 지우거나 생성할 수는 없습니다.
위 그림의 셀은 아래 그림처럼 총 3번의 조절로 원하는 너비로 바꿀 수 있습니다.
notion image
초기 셀들의 너비를 담고 있는 정수 배열 arr과 원하는 셀들의 너비를 담고 있는 정수 배열 brr이 매개변수로 주어집니다. 초기 셀들의 너비를 원하는 너비로 바꾸기 위한 최소 조절 횟수를 return 하도록 solution 함수를 완성해주세요.
5 round (재검토 결과 틀렸음 판정, 짝수일 때, diff가 큰 경우 부터선택해야하는데, 큰수부터 선택하도록 함)

문제 설명

당신은 새로 만들어진 두 개의 팀 중 한 팀을 이끄는 리더입니다. 당신은 상대 팀 리더와 경쟁을 통해 사람들을 팀으로 데려옵니다. 매 라운드마다 각 리더는 사람을 한 명씩 선택할 수 있으며, 항상 상대 팀 리더가 먼저 선택합니다. 대신, 당신에게는 원할 때 쓸 수 있는 우선권 k개가 주어집니다. 우선권을 사용한 라운드는 당신이 상대 리더보다 먼저 선택할 수 있습니다.
당신을 포함하여 리더는 항상 남은 사람들 중 가장 능력치가 높은 사람을 먼저 데려갑니다. 당신은 이 우선권을 이용해 팀원의 능력치 합이 최대한 높은 팀을 만들려고 합니다.
예를 들어 사람들의 능력치를 담은 배열이 [2, 8, 3, 6, 1, 9, 1, 9]이고, 당신에게 우선권이 2개 있는 경우, 다음과 같이 행동할 수 있습니다.
  1. 첫 번째 라운드에서는 우선권을 사용하지 않습니다. 상대는 능력치가 9인 사람을 데려가고, 당신은 능력치가 9인 사람을 데려갑니다. 남은 사람들의 능력치는 [2, 8, 3, 6, 1, 1]입니다.
  1. 두 번째 라운드에서는 우선권을 사용합니다. 당신은 능력치가 8인 사람을 데려가고, 상대는 능력치가 6인 사람을 데려갑니다. 남은 사람들의 능력치는 [2, 3, 1, 1]입니다.
  1. 세 번째 라운드에서도 우선권을 사용합니다. 당신은 능력치가 3인 사람을 데려가고, 상대는 능력치가 2인 사람을 데려갑니다. 남은 사람들의 능력치는 [1, 1]입니다.
  1. 네 번째 라운드부터는 우선권을 모두 소진했기 때문에 나중에 선택할 수밖에 없습니다. 당신과 상대는 각각 능력치가 1인 사람을 데려갑니다.
위와 같이 행동할 경우 당신은 능력치 합이 9+8+3+1=21인 팀을 만들 수 있습니다. 다른 방법으로 팀원을 선택할 수도 있지만, 능력치 합이 21보다 큰 팀은 만들 수 없습니다.
만약 사람들의 수가 홀수인 경우, 마지막에 남은 한 사람은 우선권을 사용한 경우에만 당신이 데려갈 수 있습니다. 즉, 진행되는 라운드의 총횟수는 (사람 수 + 1)를 2로 나눈 몫과 같습니다.
사람들의 능력치를 담은 정수 배열 abilities와 우선권의 개수를 나타내는 정수 k가 매개변수로 주어집니다. 우선권을 k번 이하로 사용하여 만들 수 있는 팀의 능력치 합의 최댓값을 return 하도록 solution 함수를 완성해주세요.

제한사항

  • 2 ≤ abilities의 길이 ≤ 300,000
    • 1 ≤ abilities의 원소 ≤ 10
      • 9
  • 0 ≤ 2 * k ≤ abilities의 길이 + 1

입출력 예

abilities
k
result
[2, 8, 3, 6, 1, 9, 1, 9]
2
21
[7, 6, 8, 9, 10]
1
22

입출력 예 설명

입출력 예 #1
문제 예시와 같습니다.
입출력 예 #2
다음과 같이 행동하면 됩니다.
  1. 첫 번째 라운드에서는 우선권을 사용하지 않습니다. 상대 리더는 능력치 10인 사람을, 당신은 능력치 9인 사람을 데려갑니다.
  1. 두 번째 라운드에서도 우선권을 사용하지 않습니다. 상대 리더는 능력치 8인 사람을, 당신은 능력치 7인 사람을 데려갑니다.
  1. 세 번째 라운드에서 우선권을 사용합니다. 당신은 능력치 6인 사람을 데려갑니다.
그 결과, 당신은 능력치 합이 9+7+6=22인 팀을 만들 수 있습니다. 다른 방법으로 팀원을 선택할 수도 있지만, 능력치 합이 22보다 큰 팀은 만들 수 없습니다. 따라서 22를 return 합니다.
6. 화폐거래소 (시간부족 시도못함)

문제 설명

당신은 실버를 사용해 골드를 사고파는 온라인 화폐 거래소를 운영합니다. 화폐 거래소를 이용하는 회원들은 알파벳 대소문자로 이루어진 고유한 아이디를 가지고 있습니다. 회원들은 화폐 거래소에 골드 구매 요청과 골드 판매 요청을 등록할 수 있으며, 완료되지 않은 요청은 pending, 완료된 요청은 done을 상태로 가집니다.
판매할 골드의 양이 sell_amount, 판매 가격이 sell_price인 골드 판매 요청의 등록은 다음과 같은 순서로 처리됩니다.
  1. pending 상태인 구매 요청 중 구매 가격이 sell_price 이상인 구매 요청을 찾습니다. 그러한 구매 요청이 여러 개일 경우 구매 가격이 가장 비싼 구매 요청 중 가장 먼저 등록된 구매 요청을 선택합니다. 구매 가격이 sell_price 이상인 구매 요청을 찾지 못했을 경우, 판매 요청은 pending 상태가 되며 등록을 종료합니다.
  1. 찾은 구매 요청의 구매 골드 양이 buy_amount 일 때, 골드 1당 sell_price의 가격으로 min(buy_amount, sell_amount) 만큼의 골드 거래가 이루어집니다. 거래가 이루어진 골드의 양이 amount라면, 판매자의 계좌에서 구매자의 계좌로 amount만큼의 골드가 이동하며, 구매자의 계좌에서 판매자의 계좌로 amount × sell_price만큼의 실버가 이동합니다.
  1. 구매 요청의 buy_amount가 min(buy_amount, sell_amount) 만큼 감소합니다. buy_amount가 0이 되었다면 해당 구매 요청은 done 상태가 됩니다.
  1. 판매 요청의 sell_amount가 min(buy_amount, sell_amount) 만큼 감소합니다. sell_amount가 0이 되었다면 해당 판매 요청은 done 상태가 되며, 등록을 종료합니다.
  1. sell_amount가 1 이상이라면 1번 순서로 돌아갑니다.
골드 구매 요청 또한 골드 판매 요청과 유사하게 처리됩니다. 구매할 골드의 양이 buy_amount, 구매 가격이 buy_price인 골드 구매 요청의 등록은 다음과 같은 순서로 처리됩니다.
  1. pending 상태인 판매 요청 중 판매 가격이 buy_price 이하인 판매 요청을 찾습니다. 그러한 판매 요청이 여러 개일 경우 판매 가격이 가장 싼 판매 요청 중 가장 먼저 등록된 판매 요청을 선택합니다. 판매 가격이 buy_price 이하인 판매 요청을 찾지 못했을 경우, 구매 요청은 pending 상태가 되며 등록을 종료합니다.
  1. 찾은 판매 요청의 판매 골드 양이 sell_amount 일 때, 골드 1당 sell_price의 가격으로 min(buy_amount, sell_amount) 만큼의 골드 거래가 이루어집니다. 거래가 이루어진 골드의 양이 amount라면, 판매자의 계좌에서 구매자의 계좌로 amount만큼의 골드가 이동하며, 구매자의 계좌에서 판매자의 계좌로 amount × sell_price만큼의 실버가 이동합니다.
  1. 판매 요청의 sell_amount가 min(buy_amount, sell_amount) 만큼 감소합니다. sell_amount가 0이 되었다면 해당 판매 요청은 done 상태가 됩니다.
  1. 구매 요청의 buy_amount가 min(buy_amount, sell_amount) 만큼 감소합니다. buy_amount가 0이 되었다면 해당 구매 요청은 done 상태가 되며, 등록을 종료합니다.
  1. buy_amount가 1 이상이라면 1번 순서로 돌아갑니다.
다음은 골드 구매 요청을 처리하는 예시입니다.
pending 상태인 구매 요청
등록 순서
등록자 아이디
구매 수량
구매 가격
2
Andy
10
10
5
Louis
5
11
pending 상태인 판매 요청
등록 순서
등록자 아이디
판매 수량
판매 가격
1
William
7
20
4
Rohan
4
25
3
Rohan
10
40
현재 거래소에 등록된 pending 상태인 구매/판매 요청들이 위와 같을 때, 아이디가 "Andy"인 회원이 구매 수량 = 20, 구매 가격 = 30 인 구매 요청을 등록한다고 가정합니다. 이때, 구매 요청의 등록은 다음과 같이 처리됩니다.
  1. pending 상태인 판매 요청 중 판매 가격이 가장 싼 요청은 등록순서가 1인 "William"의 판매 요청입니다. "Andy" 와 "William" 사이에 수량 = 7, 가격 = 20인 거래가 이루어지며, "William"의 판매 요청은 done 상태가 됩니다.
  1. pending 상태인 판매 요청 중 그다음으로 판매 가격이 가장 싼 요청은 등록순서가 4인 "Rohan"의 판매 요청입니다. "Andy" 와 "Rohan" 사이에 수량 = 4, 가격 = 25인 거래가 이루어지며, "Rohan"의 판매 요청은 done 상태가 됩니다.
  1. pending 상태인 판매 요청 중 그다음으로 판매 가격이 가장 싼 요청은 등록순서가 3인 "Rohan"의 판매 요청이지만, 구매 가격이 판매 가격보다 작으므로 거래는 이루어지지 않고, "Andy"의 구매 요청은 구매 수량 = 9, 구매 가격 = 30인 pending 상태가 됩니다.
위 처리가 끝난 뒤, 화폐 거래소에 등록된 pending 상태인 골드 구매/판매 요청은 아래 표와 같습니다.
pending 상태인 구매 요청
등록 순서
등록자 아이디
구매 수량
구매 가격
2
Andy
10
10
5
Louis
5
11
6
Andy
9
30
pending 상태인 판매 요청
등록 순서
등록자 아이디
판매 수량
판매 가격
3
Rohan
10
40
또한, 화폐 거래소 회원들의 골드/실버 변화를 계산해보면 아래 표와 같습니다.
회원 아이디
골드 변화
실버 변화
Andy
11
-240
Louis
0
0
Rohan
-4
100
William
-7
140
당신은 모든 구매/판매 요청 등록을 처리한 뒤 거래소 회원들의 골드/실버 변화를 계산해야 합니다.
골드 구매/판매 요청을 등록한 사람의 아이디가 순서대로 담긴 문자열 배열 req_id와 골드 구매/판매 요청의 세부 정보가 순서대로 담긴 2차원 정수 배열 req_info가 주어집니다. 모든 요청의 등록이 처리된 후 화폐 거래소 회원들의 골드와 실버 변화를 문자열 배열에 담아서 return 하도록 solution 함수를 완성해주세요.

제한사항

  • return 값 형식
    • 골드 판매/구매 요청을 등록한 기록이 있는 모든 회원의 아이디, 해당 회원의 골드 변화량과 실버 변화량을 공백으로 구분하여 문자열 배열에 담습니다.
    • 회원의 아이디가 알파벳 사전 순으로 빠른 것부터 담습니다.
    • 골드/실버가 증가할 경우 "+", 감소할 경우 "-"를 붙여 표시합니다.
    • (예시) ["A +30 -200", "B -30 +200", "C 0 0"]
  • 1 ≤ req_id의 길이 = req_info의 길이 ≤ 50,000
  • req_id의 i번째 원소는 i번째 요청을 등록한 회원의 아이디이며, 알파벳 대소문자로만 이루어진 길이 1~10 사이인 문자열입니다.
  • req_info의 i번째 원소는 i번째로 등록된 요청의 세부정보를 나타내며, [TYPE, AMOUNT, PRICE] 형태입니다.
    • TYPE은 요청의 종류를 나타내며, 구매 요청일 경우는 0, 판매 요청일 경우는 1 입니다.
    • AMOUNT는 구매/판매 할 골드의 양을 나타내며, 1~100 사이의 정수입니다.
    • PRICE는 구매/판매 할 골드의 가격을 나타내며, 1~100 사이의 정수입니다.
  • 어떤 회원의 pending 상태인 구매 요청이 있다면 그 회원은 판매 요청을 등록하지 않습니다. 또한, 반대로 어떤 회원의 pending 상태인 판매 요청이 있다면 그 회원은 구매 요청을 등록하지 않습니다.

입출력 예

req_id
req_info
result
["William", "Andy", "Rohan", "Rohan", "Louis", "Andy"]
[[1, 7, 20], [0, 10, 10], [1, 10, 40], [1, 4, 25], [0, 5, 11], [0, 20, 30]]
["Andy +11 -240", "Louis 0 0", "Rohan -4 +100", "William -7 +140"]
["Morgan", "Teo", "Covy", "Covy", "Felix"]
[[0, 10, 50], [1, 35, 70], [0, 10, 30], [0, 10, 50], [1, 11, 40]]
["Covy +1 -40", "Felix -11 +440", "Morgan +10 -400", "Teo 0 0"]

입출력 예 설명

입출력 예 #1
문제 예시와 같습니다.
입출력 예 #2
4번째 요청의 등록 처리가 끝날 때까지 아무 거래도 일어나지 않으며, 화폐 거래소에 등록된 골드 구매/판매 요청은 아래 표와 같습니다.
pending 상태인 구매 요청
등록 순서
등록자 아이디
구매 수량
구매 가격
3
Covy
10
30
4
Covy
10
50
1
Morgan
10
50
pending 상태인 판매 요청
등록 순서
등록자 아이디
판매 수량
판매 가격
2
Teo
35
70
이때 "Felix"가 등록한 판매 요청인 5번째 요청의 등록은 다음과 같이 처리됩니다.
  1. pending 상태인 구매 요청 중 구매 가격이 가장 비싼 요청은 등록순서가 4인 "Covy"의 구매 요청과 등록순서가 1인 "Morgan"의 구매 요청입니다. 두 구매 요청 중 "Morgan"의 구매 요청이 먼저 등록되었으므로 "Felix" 와 "Morgan" 사이에 수량 = 10, 가격 = 40인 거래가 이루어지며, "Morgan"의 구매 요청은 done 상태가 됩니다.
  1. pending 상태인 구매 요청 중 그다음으로 구매 가격이 가장 비싼 요청은 등록순서가 4인 "Covy"의 구매 요청입니다. "Felix" 와 "Covy" 사이에 수량 = 1, 가격 = 40인 거래가 이루어지며, "Felix"의 판매 요청은 done 상태가 되어 처리가 종료됩니다.
위 처리가 끝난 뒤, 화폐 거래소에 등록된 pending 상태인 골드 구매/판매 요청은 아래 표와 같습니다.
pending 상태인 구매 요청
등록 순서
등록자 아이디
구매 수량
구매 가격
3
Covy
10
30
4
Covy
9
50
pending 상태인 판매 요청
등록 순서
등록자 아이디
판매 수량
판매 가격
2
Teo
35
70
또한, 화폐 거래소 회원들의 골드/실버 변화를 계산해보면 아래 표와 같습니다.
회원 아이디
골드 변화
실버 변화
Covy
1
-40
Felix
-11
440
Morgan
10
-400
Teo
0
0
따라서, ["Covy +1 -40", "Felix -11 +440", "Morgan +10 -400", "Teo 0 0"]을 return 해야 합니다.
 
 
10 9 8 7 5 1 (k=2)
  • diff = [ 1,1,1,2,3] 5, 7
 
상:9,7, 5
나:10,8,1
상: 10, 8,1
나: 9, 7,5 = 21
 
상: 10,7,1
나: 9, 8,5 = 22
10 8 1 19
9 7 5 21