728x90
반응형

출처 : 프로그래머스

정수 n, left, right가 주어집니다. 다음 과정을 거쳐서 1차원 배열을 만들고자 합니다.

  1. n행 n열 크기의 비어있는 2차원 배열을 만듭니다.
  2. i = 1, 2, 3, ..., n에 대해서, 다음 과정을 반복합니다.
    • 1행 1열부터 i행 i열까지의 영역 내의 모든 빈 칸을 숫자 i로 채웁니다.
  3. 1행, 2행, ..., n행을 잘라내어 모두 이어붙인 새로운 1차원 배열을 만듭니다.
  4. 새로운 1차원 배열을 arr이라 할 때, arr[left], arr[left+1], ..., arr[right]만 남기고 나머지는 지웁니다.

정수 n, left, right가 매개변수로 주어집니다. 주어진 과정대로 만들어진 1차원 배열을 return 하도록 solution 함수를 완성해주세요.


제한사항
  • 1 ≤ n ≤ 107
  • 0 ≤ left  right < n2
  • right - left < 105

입출력 예nleftrightresult
3 2 5 [3,2,2,3]
4 7 14 [4,3,3,3,4,4,4,4]

입출력 예 설명

입출력 예 #1

  • 다음 애니메이션은 주어진 과정대로 1차원 배열을 만드는 과정을 나타낸 것입니다.

입출력 예 #2

  • 다음 애니메이션은 주어진 과정대로 1차원 배열을 만드는 과정을 나타낸 것입니다.

처음에는 엄청 어렵게 생각하였다 

for문을 두개 작성하고 하면서 하지만 시간 초과가 되었다 .

계속 풀다가 생각 해보니깐 규칙이 있다. 

아래 의 경우 

i 012,012,012

j 000,111,222

i+1 j+1에서 더 큰 값을 추가해주면 된다. 

def solution(n, left, right):
    answer = []
    for val in range(left, right+1 ):
        i,j = divmod(val,n)
        answer.append(max(i+1,j+1))
    return answer

n = 3
left = 2
right = 5
solution(n, left, right)
 
 
 
 

 

반응형

'문제 > 프로그래머스' 카테고리의 다른 글

괄호 회전하기  (0) 2022.01.23
신과 결과 받기  (0) 2022.01.22
쿼드압축 후 개수 세기  (0) 2022.01.06
스킬트리  (0) 2022.01.05
방문 길이  (0) 2022.01.03
728x90
반응형

출처 : 프로그래머스

문제 설명

0과 1로 이루어진 2n x 2n 크기의 2차원 정수 배열 arr이 있습니다. 당신은 이 arr을 쿼드 트리와 같은 방식으로 압축하고자 합니다. 구체적인 방식은 다음과 같습니다.

  1. 당신이 압축하고자 하는 특정 영역을 S라고 정의합니다.
  2. 만약 S 내부에 있는 모든 수가 같은 값이라면, S를 해당 수 하나로 압축시킵니다.
  3. 그렇지 않다면, S를 정확히 4개의 균일한 정사각형 영역(입출력 예를 참고해주시기 바랍니다.)으로 쪼갠 뒤, 각 정사각형 영역에 대해 같은 방식의 압축을 시도합니다.

arr이 매개변수로 주어집니다. 위와 같은 방식으로 arr을 압축했을 때, 배열에 최종적으로 남는 0의 개수와 1의 개수를 배열에 담아서 return 하도록 solution 함수를 완성해주세요.


제한사항
  • arr의 행의 개수는 1 이상 1024 이하이며, 2의 거듭 제곱수 형태를 하고 있습니다. 즉, arr의 행의 개수는 1, 2, 4, 8, ..., 1024 중 하나입니다.
    • arr의 각 행의 길이는 arr의 행의 개수와 같습니다. 즉, arr은 정사각형 배열입니다.
    • arr의 각 행에 있는 모든 값은 0 또는 1 입니다.

입출력 예arrresult
[[1,1,0,0],[1,0,0,0],[1,0,0,1],[1,1,1,1]] [4,9]
[[1,1,1,1,1,1,1,1],[0,1,1,1,1,1,1,1],[0,0,0,0,1,1,1,1],[0,1,0,0,1,1,1,1],[0,0,0,0,0,0,1,1],[0,0,0,0,0,0,0,1],[0,0,0,0,1,0,0,1],[0,0,0,0,1,1,1,1]] [10,15]

입출력 예 설명

입출력 예 #1

  • 다음 그림은 주어진 arr을 압축하는 과정을 나타낸 것입니다.
  • 최종 압축 결과에 0이 4개, 1이 9개 있으므로, [4,9]를 return 해야 합니다.

입출력 예 #2

  • 다음 그림은 주어진 arr을 압축하는 과정을 나타낸 것입니다.
  • 최종 압축 결과에 0이 10개, 1이 15개 있으므로, [10,15]를 return 해야 합니다.
answer = {0:0, 1:0}


def findArr(startx, endx, starty, endy , arr):
    value = arr[startx][starty]
    
    issame = True
    for i in range(startx, endx):
        for j in range(starty, endy):
            if arr[i][j] != value:
                issame= False
                break

        if not issame :
            break
    if issame :
        answer[value] = answer.get(value) +1
        return (True if value==1 else False,True,startx, endx, starty, endy)
    else:
        topleft = findArr(startx, (startx+endx)//2 , starty,(starty+endy)//2 , arr)
        topright = findArr(startx, (startx+endx)//2 , (starty+endy)//2,endy , arr)
        bottomleft = findArr((startx+endx)//2, endx ,starty,(starty+endy)//2 , arr)
        bottomright = findArr((startx+endx)//2, endx ,(starty+endy)//2,endy , arr)
        return (False, False, topleft,topright,bottomleft,bottomright)

def solution(arr):
    n = len(arr)
    findArr(0, n, 0, n , arr)
    return list(answer.values())

#arr= [[1,1,0,0],[1,0,0,0],[1,0,0,1],[1,1,1,1]]
 
arr=[[1,1,1,1,1,1,1,1],[0,1,1,1,1,1,1,1],[0,0,0,0,1,1,1,1],[0,1,0,0,1,1,1,1],[0,0,0,0,0,0,1,1],[0,0,0,0,0,0,0,1],[0,0,0,0,1,0,0,1],[0,0,0,0,1,1,1,1]]
solution(arr)
반응형

'문제 > 프로그래머스' 카테고리의 다른 글

신과 결과 받기  (0) 2022.01.22
n^2 배열 자르기  (0) 2022.01.15
스킬트리  (0) 2022.01.05
방문 길이  (0) 2022.01.03
[3차] 방금그곡  (0) 2021.12.30
728x90
반응형

출처 : 프로그래머스

선행 스킬이란 어떤 스킬을 배우기 전에 먼저 배워야 하는 스킬을 뜻합니다.

예를 들어 선행 스킬 순서가 스파크 → 라이트닝 볼트 → 썬더일때, 썬더를 배우려면 먼저 라이트닝 볼트를 배워야 하고, 라이트닝 볼트를 배우려면 먼저 스파크를 배워야 합니다.

위 순서에 없는 다른 스킬(힐링 등)은 순서에 상관없이 배울 수 있습니다. 따라서 스파크 → 힐링 → 라이트닝 볼트 → 썬더와 같은 스킬트리는 가능하지만, 썬더 → 스파크나 라이트닝 볼트 → 스파크 → 힐링 → 썬더와 같은 스킬트리는 불가능합니다.

선행 스킬 순서 skill과 유저들이 만든 스킬트리1를 담은 배열 skill_trees가 매개변수로 주어질 때, 가능한 스킬트리 개수를 return 하는 solution 함수를 작성해주세요.

제한 조건

  • 스킬은 알파벳 대문자로 표기하며, 모든 문자열은 알파벳 대문자로만 이루어져 있습니다.
  • 스킬 순서와 스킬트리는 문자열로 표기합니다.
    • 예를 들어, C → B → D 라면 "CBD"로 표기합니다
  • 선행 스킬 순서 skill의 길이는 1 이상 26 이하이며, 스킬은 중복해 주어지지 않습니다.
  • skill_trees는 길이 1 이상 20 이하인 배열입니다.
  • skill_trees의 원소는 스킬을 나타내는 문자열입니다.
    • skill_trees의 원소는 길이가 2 이상 26 이하인 문자열이며, 스킬이 중복해 주어지지 않습니다.

입출력 예

skillskill_treesreturn

"CBD" ["BACDE", "CBADF", "AECB", "BDA"] 2

입출력 예 설명

  • "BACDE": B 스킬을 배우기 전에 C 스킬을 먼저 배워야 합니다. 불가능한 스킬트립니다.
  • "CBADF": 가능한 스킬트리입니다.
  • "AECB": 가능한 스킬트리입니다.
  • "BDA": B 스킬을 배우기 전에 C 스킬을 먼저 배워야 합니다. 불가능한 스킬트리입니다.

  1. 스킬 트리: 유저가 스킬을 배울 순서 
 

코딩테스트 연습 - 스킬트리

 

programmers.co.kr

  1. index를 찾는다. 해당 index가 있을 경우만 return 한다.
  2. index가 있는 값만 result을 추가한다.
  3. result의 길이가 0일 경우에는 answer의 값을 추가한다.
  4. match_skill 길이만큼 list를 생성한다. 예를 들어 아래 케이스의 경우 : [0, 1, 2, 3]
  5. 정렬된 result과 result길이 만큼 짤린 match_skill 의 값이 같을 경우 예를 들어 result=[0,1] result과 result길이 만큼 짤린 match_skill 의 값이 같을 경우 result=[1,0]을 방지하기 위해서
def solution(skill, skill_trees):
    answer = 0
    match_skill = "".join([str(i) for i in range(len(skill))])
    for skill_tree in skill_trees:
        result= ""
        for i in skill_tree:
            skill_index = skill.find(i)
            if (skill_index) != -1:
                result += str(skill_index)
        
        if result == match_skill[:len(result)]:
            answer+= 1

    return answer

다른 사람 풀이를 보니깐 매우 간단하게 하였다. 좀 너무 어렵게 접근한 것 같다. 

그래서 코드를 좀 수정하였다. 

 

 

반응형

'문제 > 프로그래머스' 카테고리의 다른 글

n^2 배열 자르기  (0) 2022.01.15
쿼드압축 후 개수 세기  (0) 2022.01.06
방문 길이  (0) 2022.01.03
[3차] 방금그곡  (0) 2021.12.30
가장 큰 정사각형 찾기  (0) 2021.12.24
728x90
반응형

출처 : 프로그래머스

문제 설명

게임 캐릭터를 4가지 명령어를 통해 움직이려 합니다. 명령어는 다음과 같습니다.

  • U: 위쪽으로 한 칸 가기
  • D: 아래쪽으로 한 칸 가기
  • R: 오른쪽으로 한 칸 가기
  • L: 왼쪽으로 한 칸 가기

캐릭터는 좌표평면의 (0, 0) 위치에서 시작합니다. 좌표평면의 경계는 왼쪽 위(-5, 5), 왼쪽 아래(-5, -5), 오른쪽 위(5, 5), 오른쪽 아래(5, -5)로 이루어져 있습니다.

예를 들어, "ULURRDLLU"로 명령했다면

  • 1번 명령어부터 7번 명령어까지 다음과 같이 움직입니다.
  • 8번 명령어부터 9번 명령어까지 다음과 같이 움직입니다.

이때, 우리는 게임 캐릭터가 지나간 길 중 캐릭터가 처음 걸어본 길의 길이를 구하려고 합니다. 예를 들어 위의 예시에서 게임 캐릭터가 움직인 길이는 9이지만, 캐릭터가 처음 걸어본 길의 길이는 7이 됩니다. (8, 9번 명령어에서 움직인 길은 2, 3번 명령어에서 이미 거쳐 간 길입니다)

단, 좌표평면의 경계를 넘어가는 명령어는 무시합니다.

예를 들어, "LULLLLLLU"로 명령했다면

  • 1번 명령어부터 6번 명령어대로 움직인 후, 7, 8번 명령어는 무시합니다. 다시 9번 명령어대로 움직입니다.

이때 캐릭터가 처음 걸어본 길의 길이는 7이 됩니다.

명령어가 매개변수 dirs로 주어질 때, 게임 캐릭터가 처음 걸어본 길의 길이를 구하여 return 하는 solution 함수를 완성해 주세요.

제한사항
  • dirs는 string형으로 주어지며, 'U', 'D', 'R', 'L' 이외에 문자는 주어지지 않습니다.
  • dirs의 길이는 500 이하의 자연수입니다.
입출력 예dirsanswer
"ULURRDLLU" 7
"LULLLLLLU" 7
입출력 예 설명

입출력 예 #1
문제의 예시와 같습니다.

입출력 예 #2
문제의 예시와 같습니다.

 

foot = tuple(sorted([foot_list[-1], (next_i, next_j)])) => 이 부분을 다른 사람 풀이 참조 하였다. 

def solution(dirs):
    dirs_dic = {'U':[0,-1],'D':[0,1], 'R':[1,0],'L':[-1,0]}
    answer = 0
    _list = []
    for i in dirs:
        _list.append(dirs_dic.get(i))

    foot_list = [(0,0)]
    footprint = set()
    # 좌표평면의 경계는 왼쪽 위(-5, 5), 왼쪽 아래(-5, -5), 오른쪽 위(5, 5), 오른쪽 아래(5, -5)로 이루어져 있습니다.
    for i, j in _list:
        next_i, next_j = foot_list[-1][0]+i,  foot_list[-1][1]+j
        if -5 <= next_i <= 5 and -5 <= next_j <= 5:

            foot = tuple(sorted([foot_list[-1], (next_i, next_j)]))
            footprint.add(foot)
            foot_list.append((next_i,next_j))
    
    answer+=len(footprint)
    return answer
반응형

'문제 > 프로그래머스' 카테고리의 다른 글

쿼드압축 후 개수 세기  (0) 2022.01.06
스킬트리  (0) 2022.01.05
[3차] 방금그곡  (0) 2021.12.30
가장 큰 정사각형 찾기  (0) 2021.12.24
[3차] 압축  (0) 2021.12.23
728x90
반응형

출처 : 프로그래머스

 

코딩테스트 연습 - [3차] 방금그곡

방금그곡 라디오를 자주 듣는 네오는 라디오에서 방금 나왔던 음악이 무슨 음악인지 궁금해질 때가 많다. 그럴 때 네오는 다음 포털의 '방금그곡' 서비스를 이용하곤 한다. 방금그곡에서는 TV,

programmers.co.kr

문제 설명

방금그곡

라디오를 자주 듣는 네오는 라디오에서 방금 나왔던 음악이 무슨 음악인지 궁금해질 때가 많다. 그럴 때 네오는 다음 포털의 '방금그곡' 서비스를 이용하곤 한다. 방금그곡에서는 TV, 라디오 등에서 나온 음악에 관해 제목 등의 정보를 제공하는 서비스이다.

네오는 자신이 기억한 멜로디를 가지고 방금그곡을 이용해 음악을 찾는다. 그런데 라디오 방송에서는 한 음악을 반복해서 재생할 때도 있어서 네오가 기억하고 있는 멜로디는 음악 끝부분과 처음 부분이 이어서 재생된 멜로디일 수도 있다. 반대로, 한 음악을 중간에 끊을 경우 원본 음악에는 네오가 기억한 멜로디가 들어있다 해도 그 곡이 네오가 들은 곡이 아닐 수도 있다. 그렇기 때문에 네오는 기억한 멜로디를 재생 시간과 제공된 악보를 직접 보면서 비교하려고 한다. 다음과 같은 가정을 할 때 네오가 찾으려는 음악의 제목을 구하여라.

  • 방금그곡 서비스에서는 음악 제목, 재생이 시작되고 끝난 시각, 악보를 제공한다.
  • 네오가 기억한 멜로디와 악보에 사용되는 음은 C, C#, D, D#, E, F, F#, G, G#, A, A#, B 12개이다.
  • 각 음은 1분에 1개씩 재생된다. 음악은 반드시 처음부터 재생되며 음악 길이보다 재생된 시간이 길 때는 음악이 끊김 없이 처음부터 반복해서 재생된다. 음악 길이보다 재생된 시간이 짧을 때는 처음부터 재생 시간만큼만 재생된다.
  • 음악이 00:00를 넘겨서까지 재생되는 일은 없다.
  • 조건이 일치하는 음악이 여러 개일 때에는 라디오에서 재생된 시간이 제일 긴 음악 제목을 반환한다. 재생된 시간도 같을 경우 먼저 입력된 음악 제목을 반환한다.
  • 조건이 일치하는 음악이 없을 때에는 “(None)”을 반환한다.

입력 형식

입력으로 네오가 기억한 멜로디를 담은 문자열 m과 방송된 곡의 정보를 담고 있는 배열 musicinfos가 주어진다.

  • m은 음 1개 이상 1439개 이하로 구성되어 있다.
  • musicinfos는 100개 이하의 곡 정보를 담고 있는 배열로, 각각의 곡 정보는 음악이 시작한 시각, 끝난 시각, 음악 제목, 악보 정보가 ','로 구분된 문자열이다.
    • 음악의 시작 시각과 끝난 시각은 24시간 HH:MM 형식이다.
    • 음악 제목은 ',' 이외의 출력 가능한 문자로 표현된 길이 1 이상 64 이하의 문자열이다.
    • 악보 정보는 음 1개 이상 1439개 이하로 구성되어 있다.

출력 형식

조건과 일치하는 음악 제목을 출력한다.

입출력 예시

mmusicinfosanswer
"ABCDEFG" ["12:00,12:14,HELLO,CDEFGAB", "13:00,13:05,WORLD,ABCDEF"] "HELLO"
"CC#BCC#BCC#BCC#B" ["03:00,03:30,FOO,CC#B", "04:00,04:08,BAR,CC#BCC#BCC#B"] "FOO"
"ABC" ["12:00,12:14,HELLO,C#DEFGAB", "13:00,13:05,WORLD,ABCDEF"] "WORLD"

설명

첫 번째 예시에서 HELLO는 길이가 7분이지만 12:00부터 12:14까지 재생되었으므로 실제로 CDEFGABCDEFGAB로 재생되었고, 이 중에 기억한 멜로디인 ABCDEFG가 들어있다.
세 번째 예시에서 HELLO는 C#DEFGABC#DEFGAB로, WORLD는 ABCDE로 재생되었다. HELLO 안에 있는 ABC#은 기억한 멜로디인 ABC와 일치하지 않고, WORLD 안에 있는 ABC가 기억한 멜로디와 일치한다.

 

풀이 과정: 

테스트 4 실패 (2.63ms, 10.9MB)
테스트 11 실패 (4.38ms, 10.9MB)
테스트 20 실패 (2.51ms, 10.8MB)
테스트 22 실패 (2.63ms, 10.9MB)
테스트 23 실패 (2.68ms, 10.9MB)
테스트 24 실패 (2.52ms, 10.8MB)
테스트 27 실패 (2.07ms, 10.8MB)
테스트 28 실패 (1.98ms, 10.8MB)
테스트 29 실패 (4.36ms, 10.9MB)

answer = '(None)' 을 추가해서 

테스트 4 실패 (2.33ms, 10.9MB)
테스트 11 실패 (3.71ms, 10.9MB)
테스트 20 실패 (2.46ms, 10.8MB)
테스트 27 실패 (2.38ms, 10.8MB)
테스트 28 실패 (2.17ms, 10.9MB)

조건이 일치하는 음악이 여러 개일 때에는 라디오에서 재생된 시간이 제일 긴 음악 제목을 반환한다. => 이부분을 수정하니 30만 틀린다. 

테스트 30 실패 (4.23ms, 10.9MB)

재생시간이 짧을 때 짤라줘서 성공하였다. 

 

from datetime import datetime

def dif(start, end):
    start = datetime.strptime(start,'%H:%M')
    end = datetime.strptime(end,'%H:%M')
    diff = end-start 
    return diff.seconds// 60

def solution(m, musicinfos):
    answer = []
    #이 부분은 참조
    rmm ={'C#': 'c','D#': 'd','F#': 'f','G#': 'g','A#': 'a','E#': 'e'}

    for keys in rmm.keys() :
        m = m.replace(keys, rmm.get(keys))
    
    for i in musicinfos:
        musicinfo = i.split(',')
        diff = dif(musicinfo[0],musicinfo[1])
        m_= musicinfo[-1]
        for keys in rmm.keys() :
            m_ = m_.replace(keys, rmm.get(keys))
        cnt = 0
        while len(m_) < diff:
            m_ += m_[cnt]
            cnt+=1
        if len(m_) > diff:
            m_ = m[:diff+1]

        if m in m_:
            answer.append((musicinfo[2],diff,musicinfo[0]))
    if not len(answer):
        return '(None)'

    return max(answer,key = lambda x:x[1])[0]

m = "CC#BCC#BCC#BCC#B"
musicinfos = ["03:00,03:30,FOO,CC#B","03:00,03:01,FOO,CC#B","02:00,02:30,FOO2,CC#B", "04:00,04:08,BAR,CC#BCC#BCC#B"]
solution(m, musicinfos)
반응형

'문제 > 프로그래머스' 카테고리의 다른 글

스킬트리  (0) 2022.01.05
방문 길이  (0) 2022.01.03
가장 큰 정사각형 찾기  (0) 2021.12.24
[3차] 압축  (0) 2021.12.23
[3차] 파일명 정렬  (0) 2021.12.17
728x90
반응형

출처 : 프로그래머스

 

문제 설명

1와 0로 채워진 표(board)가 있습니다. 표 1칸은 1 x 1 의 정사각형으로 이루어져 있습니다. 표에서 1로 이루어진 가장 큰 정사각형을 찾아 넓이를 return 하는 solution 함수를 완성해 주세요. (단, 정사각형이란 축에 평행한 정사각형을 말합니다.)

예를 들어

1234
0 1 1 1
1 1 1 1
1 1 1 1
0 0 1 0

가 있다면 가장 큰 정사각형은

1234
0 1 1 1
1 1 1 1
1 1 1 1
0 0 1 0

가 되며 넓이는 9가 되므로 9를 반환해 주면 됩니다.

제한사항
  • 표(board)는 2차원 배열로 주어집니다.
  • 표(board)의 행(row)의 크기 : 1,000 이하의 자연수
  • 표(board)의 열(column)의 크기 : 1,000 이하의 자연수
  • 표(board)의 값은 1또는 0으로만 이루어져 있습니다.

입출력 예boardanswer
[[0,1,1,1],[1,1,1,1],[1,1,1,1],[0,0,1,0]] 9
[[0,0,1,1],[1,1,1,1]] 4
입출력 예 설명

입출력 예 #1
위의 예시와 같습니다.

입출력 예 #2
| 0 | 0 | 1 | 1 |
| 1 | 1 | 1 | 1 |
로 가장 큰 정사각형의 넓이는 4가 되므로 4를 return합니다.

   
   

 

def solution(board):
    answer = 0
    n = len(board)
    for i in range(1,n):
        for j in range(1,len(board[i])):
            if board[i][j] == 1 : 
                board[i][j] = min(board[i-1][j-1],board[i-1][j],board[i][j-1])+1 
    

    answer = []
    for i in range(n):
        answer.append(max(board[i]))
    
    return max(answer)**2


board = [[0,1,1,1],[1,1,1,1],[1,1,1,1],[0,0,1,0]]	
solution(board)
반응형

'문제 > 프로그래머스' 카테고리의 다른 글

방문 길이  (0) 2022.01.03
[3차] 방금그곡  (0) 2021.12.30
[3차] 압축  (0) 2021.12.23
[3차] 파일명 정렬  (0) 2021.12.17
구명보트  (0) 2021.12.17
728x90
반응형

출차 : 프로그래머스

 

코딩테스트 연습 - [3차] 압축

TOBEORNOTTOBEORTOBEORNOT [20, 15, 2, 5, 15, 18, 14, 15, 20, 27, 29, 31, 36, 30, 32, 34]

programmers.co.kr

압축

신입사원 어피치는 카카오톡으로 전송되는 메시지를 압축하여 전송 효율을 높이는 업무를 맡게 되었다. 메시지를 압축하더라도 전달되는 정보가 바뀌어서는 안 되므로, 압축 전의 정보를 완벽하게 복원 가능한 무손실 압축 알고리즘을 구현하기로 했다.

어피치는 여러 압축 알고리즘 중에서 성능이 좋고 구현이 간단한 LZW(Lempel–Ziv–Welch) 압축을 구현하기로 했다. LZW 압축은 1983년 발표된 알고리즘으로, 이미지 파일 포맷인 GIF 등 다양한 응용에서 사용되었다.

LZW 압축은 다음 과정을 거친다.

  1. 길이가 1인 모든 단어를 포함하도록 사전을 초기화한다.
  2. 사전에서 현재 입력과 일치하는 가장 긴 문자열 w를 찾는다.
  3. w에 해당하는 사전의 색인 번호를 출력하고, 입력에서 w를 제거한다.
  4. 입력에서 처리되지 않은 다음 글자가 남아있다면(c), w+c에 해당하는 단어를 사전에 등록한다.
  5. 단계 2로 돌아간다.

압축 알고리즘이 영문 대문자만 처리한다고 할 때, 사전은 다음과 같이 초기화된다. 사전의 색인 번호는 정수값으로 주어지며, 1부터 시작한다고 하자.

색인 번호123...242526

단어 A B C ... X Y Z

예를 들어 입력으로 KAKAO가 들어온다고 하자.

  1. 현재 사전에는 KAKAO의 첫 글자 K는 등록되어 있으나, 두 번째 글자까지인 KA는 없으므로, 첫 글자 K에 해당하는 색인 번호 11을 출력하고, 다음 글자인 A를 포함한 KA를 사전에 27 번째로 등록한다.
  2. 두 번째 글자 A는 사전에 있으나, 세 번째 글자까지인 AK는 사전에 없으므로, A의 색인 번호 1을 출력하고, AK를 사전에 28 번째로 등록한다.
  3. 세 번째 글자에서 시작하는 KA가 사전에 있으므로, KA에 해당하는 색인 번호 27을 출력하고, 다음 글자 O를 포함한 KAO를 29 번째로 등록한다.
  4. 마지막으로 처리되지 않은 글자 O에 해당하는 색인 번호 15를 출력한다.

현재 입력(w)다음 글자(c)출력사전 추가(w+c)

K A 11 27: KA
A K 1 28: AK
KA O 27 29: KAO
O   15  

이 과정을 거쳐 다섯 글자의 문장 KAKAO가 4개의 색인 번호 [11, 1, 27, 15]로 압축된다.

입력으로 TOBEORNOTTOBEORTOBEORNOT가 들어오면 다음과 같이 압축이 진행된다.

현재 입력(w)다음 글자(c)출력사전 추가(w+c)

T O 20 27: TO
O B 15 28: OB
B E 2 29: BE
E O 5 30: EO
O R 15 31: OR
R N 18 32: RN
N O 14 33: NO
O T 15 34: OT
T T 20 35: TT
TO B 27 36: TOB
BE O 29 37: BEO
OR T 31 38: ORT
TOB E 36 39: TOBE
EO R 30 40: EOR
RN O 32 41: RNO
OT   34  

입력 형식

입력으로 영문 대문자로만 이뤄진 문자열 msg가 주어진다. msg의 길이는 1 글자 이상, 1000 글자 이하이다.

출력 형식

주어진 문자열을 압축한 후의 사전 색인 번호를 배열로 출력하라.

입출력 예제

msganswer

KAKAO [11, 1, 27, 15]
TOBEORNOTTOBEORTOBEORNOT [20, 15, 2, 5, 15, 18, 14, 15, 20, 27, 29, 31, 36, 30, 32, 34]
ABABABABABABABAB [1, 2, 27, 29, 28, 31, 30]
dict_ =  {}
index_ = 1
for x in range(65,91):
    dict_[chr(x)] = index_
    index_ += 1

def solution(msg):
    answer = [] 
    i = 0
    w = msg[0]
    while i != len(msg):
        if w in dict_.keys():
            if i != len(msg)-1:
                i+= 1
            else:
                answer.append(dict_.get(w))
                print(w, answer)
                break
            w += msg[i]
        else:
            dict_[w] = max(dict_.values())+1
            answer.append(dict_.get(w[:-1]))
            w = msg[i]
    return answer

msg="KAKAO"
solution(msg)
반응형

'문제 > 프로그래머스' 카테고리의 다른 글

[3차] 방금그곡  (0) 2021.12.30
가장 큰 정사각형 찾기  (0) 2021.12.24
[3차] 파일명 정렬  (0) 2021.12.17
구명보트  (0) 2021.12.17
루시와 엘라 찾기  (0) 2021.12.09
728x90
반응형

출처 : 프로그래머스

 

코딩테스트 연습 - [3차] 파일명 정렬

파일명 정렬 세 차례의 코딩 테스트와 두 차례의 면접이라는 기나긴 블라인드 공채를 무사히 통과해 카카오에 입사한 무지는 파일 저장소 서버 관리를 맡게 되었다. 저장소 서버에는 프로그램

programmers.co.kr

문제 설명

파일명 정렬

세 차례의 코딩 테스트와 두 차례의 면접이라는 기나긴 블라인드 공채를 무사히 통과해 카카오에 입사한 무지는 파일 저장소 서버 관리를 맡게 되었다.

저장소 서버에는 프로그램의 과거 버전을 모두 담고 있어, 이름 순으로 정렬된 파일 목록은 보기가 불편했다. 파일을 이름 순으로 정렬하면 나중에 만들어진 ver-10.zip이 ver-9.zip보다 먼저 표시되기 때문이다.

버전 번호 외에도 숫자가 포함된 파일 목록은 여러 면에서 관리하기 불편했다. 예컨대 파일 목록이 ["img12.png", "img10.png", "img2.png", "img1.png"]일 경우, 일반적인 정렬은 ["img1.png", "img10.png", "img12.png", "img2.png"] 순이 되지만, 숫자 순으로 정렬된 ["img1.png", "img2.png", "img10.png", img12.png"] 순이 훨씬 자연스럽다.

무지는 단순한 문자 코드 순이 아닌, 파일명에 포함된 숫자를 반영한 정렬 기능을 저장소 관리 프로그램에 구현하기로 했다.

소스 파일 저장소에 저장된 파일명은 100 글자 이내로, 영문 대소문자, 숫자, 공백(" "), 마침표("."), 빼기 부호("-")만으로 이루어져 있다. 파일명은 영문자로 시작하며, 숫자를 하나 이상 포함하고 있다.

파일명은 크게 HEAD, NUMBER, TAIL의 세 부분으로 구성된다.

  • HEAD는 숫자가 아닌 문자로 이루어져 있으며, 최소한 한 글자 이상이다.
  • NUMBER는 한 글자에서 최대 다섯 글자 사이의 연속된 숫자로 이루어져 있으며, 앞쪽에 0이 올 수 있다. 0부터 99999 사이의 숫자로, 00000이나 0101 등도 가능하다.
  • TAIL은 그 나머지 부분으로, 여기에는 숫자가 다시 나타날 수도 있으며, 아무 글자도 없을 수 있다.
파일명HEADNUMBERTAIL
foo9.txt foo 9 .txt
foo010bar020.zip foo 010 bar020.zip
F-15 F- 15 (빈 문자열)

파일명을 세 부분으로 나눈 후, 다음 기준에 따라 파일명을 정렬한다.

  • 파일명은 우선 HEAD 부분을 기준으로 사전 순으로 정렬한다. 이때, 문자열 비교 시 대소문자 구분을 하지 않는다. MUZI와 muzi, MuZi는 정렬 시에 같은 순서로 취급된다.
  • 파일명의 HEAD 부분이 대소문자 차이 외에는 같을 경우, NUMBER의 숫자 순으로 정렬한다. 9 < 10 < 0011 < 012 < 13 < 014 순으로 정렬된다. 숫자 앞의 0은 무시되며, 012와 12는 정렬 시에 같은 같은 값으로 처리된다.
  • 두 파일의 HEAD 부분과, NUMBER의 숫자도 같을 경우, 원래 입력에 주어진 순서를 유지한다. MUZI01.zip과 muzi1.png가 입력으로 들어오면, 정렬 후에도 입력 시 주어진 두 파일의 순서가 바뀌어서는 안 된다.

무지를 도와 파일명 정렬 프로그램을 구현하라.

입력 형식

입력으로 배열 files가 주어진다.

  • files는 1000 개 이하의 파일명을 포함하는 문자열 배열이다.
  • 각 파일명은 100 글자 이하 길이로, 영문 대소문자, 숫자, 공백(" "), 마침표("."), 빼기 부호("-")만으로 이루어져 있다. 파일명은 영문자로 시작하며, 숫자를 하나 이상 포함하고 있다.
  • 중복된 파일명은 없으나, 대소문자나 숫자 앞부분의 0 차이가 있는 경우는 함께 주어질 수 있다. (muzi1.txt, MUZI1.txt, muzi001.txt, muzi1.TXT는 함께 입력으로 주어질 수 있다.)

출력 형식

위 기준에 따라 정렬된 배열을 출력한다.

입출력 예제

입력: ["img12.png", "img10.png", "img02.png", "img1.png", "IMG01.GIF", "img2.JPG"]
출력: ["img1.png", "IMG01.GIF", "img02.png", "img2.JPG", "img10.png", "img12.png"]

입력: ["F-5 Freedom Fighter", "B-50 Superfortress", "A-10 Thunderbolt II", "F-14 Tomcat"]
출력: ["A-10 Thunderbolt II", "B-50 Superfortress", "F-5 Freedom Fighter", "F-14 Tomcat"]

 

import re

def solution(files):
    answer = []
    list_ = []
    for idx,file in enumerate(files):
        # 숫자
        regex = re.compile(r'\d+')
        matchobj = [(m.start(0), m.end(0)) for m in re.finditer(regex, file)]
        file_head = file[0:matchobj[0][0]]
        file_number = file[matchobj[0][0]:matchobj[0][1]]
        file_tail= file[matchobj[0][1]:]
        file_idx = idx
        list_.append([file_head,file_number, file_tail ])
    list_ = sorted(list_ , key=lambda x: (x[0].upper(), int(x[1])))
    answer = ["".join(i) for i in list_]
    return answer

files = ["img12.png", "img10.png", "img02.png", "img1.png", "IMG01.GIF", "img2.JPG"]
#files = ["F-5 Freedom Fighter", "B-50 Superfortress", "A-10 Thunderbolt II", "F-14 Tomcat"]
solution(files)
반응형

'문제 > 프로그래머스' 카테고리의 다른 글

가장 큰 정사각형 찾기  (0) 2021.12.24
[3차] 압축  (0) 2021.12.23
구명보트  (0) 2021.12.17
루시와 엘라 찾기  (0) 2021.12.09
고양이와 개는 몇 마리 있을까  (0) 2021.12.09

+ Recent posts