https://softeer.ai/practice/6250

 

Softeer - 현대자동차그룹 SW인재확보플랫폼

 

softeer.ai

 

1차 코드 - 시간 초과 / 반복 중첩, count 등

n = int(input())
scores = []
total_score = [0] * n

for _ in range(3):
    cur = list(map(int, input().split()))
    scores.append(cur)
    for i in range(n):
        total_score[i] += cur[i]
scores.append(total_score)

for score in scores:
    result = []
    tmp = sorted(score, reverse=True)

    for s in score:
        count = 1
        for i in range(len(tmp)):
            if s < tmp[i]:
                count += 1
        result.append(count)
    print(*result)

 

2차 코드 - 통과 / Counter, dict, hash 활용

from collections import Counter

n = int(input())
scores = []
total_score = [0] * n

# 대회 결과 저장
for _ in range(3):
    cur = list(map(int, input().split()))
    scores.append(cur)
    for i in range(n):
        total_score[i] += cur[i]
scores.append(total_score)

# 솔루션
for score in scores:
    score_counter = Counter(score)
    score_set = list(set(score))
    score_set.sort(reverse=True)
    score_dic = dict()
    
    token = 1
    for s in score_set:
        score_dic[s] = token
        token += score_counter[s]
        
    result = []
    for i in score:
        result.append(score_dic[i])
    print(*result)

 

Key Point

- 문제에 나와있는대로,  각 사람마다 “나보다 점수가 큰 사람”의 수를 세어 1을 더한 것이 자신의 등수가 된다. 를 구현하면 풀리는 문제.

복잡하게 생각하고, 어렵게 구현할 필요가 없다.

Counter를 통해, 같은 점수의 개수를 구해주고, 있을 때 마다 순위가 1씩 밀리게 됨.

https://softeer.ai/practice/6255

 

Softeer - 현대자동차그룹 SW인재확보플랫폼

 

softeer.ai

message = input()
key = input()
maps = []
data = []

# 암호키 테이블 만들기 (가로축 데이터 맵)
for i in range(len(key)):
    if key[i] not in maps:
        maps.append(key[i])
            
for i in range(65, 92):
    if chr(i) not in maps and chr(i) != 'J':
        maps.append(chr(i))
maps = maps[:25]
tmp_maps = maps # 일차원 데이터 맵

for _ in range(5):
    data.append(maps[:5])
    maps = maps[5:]

# 세로축 데이터 맵
col_data = []
for i in range(5):
    tmp = ""
    for j in range(5):
        tmp += data[j][i]
    col_data.append(tmp)


# 메시지 나누기
token = 0
tmp_message = message


while True:
    flag = True
    for i in range(0, len(tmp_message), 2):
        m = tmp_message[i:i + 2]
        if len(m) == 2 and m[0] == m[1]:
            flag = False
            if m[0] != 'X':
                tmp_message = tmp_message[:i + 1] + 'X' + tmp_message[i + 1:]
            else:
                tmp_message = tmp_message[:i + 1] + 'Q' + tmp_message[i + 1:]
            break
    if flag:
        break
        
if len(tmp_message) % 2 != 0:
    tmp_message += 'X'
    
message = []
for i in range(len(tmp_message) // 2):
    message.append(tmp_message[:2])
    tmp_message = tmp_message[2:]


# 메시지 암호화
def row_check(token):
    for i in range(5):
        tmp = ""
        if token[0] in data[i] and token[1] in data[i]:
            l_idx, r_idx = data[i].index(token[0]), data[i].index(token[1])
            if l_idx == 4:
                tmp += data[i][0]
            else:
                tmp += data[i][l_idx + 1]
                
            if r_idx == 4:
                tmp += data[i][0]
            else:
                tmp += data[i][r_idx + 1]
            return tmp
                    

def col_check(token):
    for i in range(5):
        tmp = ""
        if token[0] in col_data[i] and token[1] in col_data[i]:
            l_idx, r_idx = col_data[i].index(token[0]), col_data[i].index(token[1])
            if l_idx == 4:
                tmp += col_data[i][0]
            else:
                tmp += col_data[i][l_idx + 1]
                
            if r_idx == 4:
                tmp += col_data[i][0]
            else:
                tmp += col_data[i][r_idx + 1]
            return tmp


def cross_check(token):
    l_idx = tmp_maps.index(token[0])
    r_idx = tmp_maps.index(token[1])
    l_i, l_j = l_idx // 5, l_idx % 5
    r_i, r_j = r_idx // 5, r_idx % 5
    return data[l_i][r_j] + data[r_i][l_j]


result = ""
for m in message:
    cur = row_check(m)
    if not cur:
        cur = col_check(m)
    if not cur:
        cur = cross_check(m)
    result += cur
print(result)

 

단순 구현문제이나, 2차원 배열의 인덱싱, "반복 구간에서 특정 변동 변수를 다루는 방법 (인덱스 에러 조치)"이 중요하여 lv3 인듯,

암호화할 문자를 2개씩 끊어서 저장하는 방식에서 시간 잡아먹음. 

https://softeer.ai/practice/6266

 

Softeer - 현대자동차그룹 SW인재확보플랫폼

 

softeer.ai

n, k = map(int, input().split())
room_list = dict()

for _ in range(n):
    room_list[input()] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1]

for _ in range(k):
    name, start, end = input().split()
    for i in range(int(start), int(end)):
        room_list[name][i] = 0

name_list = list(room_list.keys())
name_list.sort()

for j in range(len(name_list)):
    name = name_list[j]
    print(f"Room {name}:")
    
    if sum(room_list[name]) == 0:
        print("Not available")
        
    else:
        result = []
        start = -1
        for i in range(9, 18):
            if room_list[name][i] == 1:
                if start == -1:
                    start = i
            elif room_list[name][i] == 0:
                if start != -1:
                    result.append(str(start).zfill(2) + "-" + str(i).zfill(2))
                    start = -1
        if start != -1:
            result.append(str(start).zfill(2) + "-" + str(i + 1))
        print(f"{len(result)} available:")
        print("\n".join(result))
    
    if j + 1 != len(name_list):
        print("-----")

 

key point:

- zfill 함수로 숫자 계수 맞춰줄 수 있다 (2, 4, 5 -> 02, 04, 05) 등

- "\n".join(리스트) 를 통해 리스트 내 요소들을 띄워쓰기로 표시할 수 있다.

나의 코드

import heapq

def solution(n, works):
    if n >= sum(works):
        return 0
    
    answer = 0
    works = [-w for w in works]
    heapq.heapify(works)
    
    for i in range(n):
        cur = heapq.heappop(works)
        cur += 1
        heapq.heappush(works, cur)
    
    return sum([i ** 2 for i in works])

 

풀이 방법

매 연산마다 정렬시 시간 초과, 최소 힙을 이용해 구현

+ Recent posts