관리 메뉴

솜씨좋은장씨

[BaekJoon] 6324번 : URLs (Python) 본문

Programming/코딩 1일 1문제

[BaekJoon] 6324번 : URLs (Python)

솜씨좋은장씨 2022. 11. 20. 12:29
728x90
반응형

코딩 1일 1문제! 오늘의 문제는 백준의 URLs 입니다.

 

6324번: URLs

For each URL in the input first print the number of the URL, as shown in the sample output. Then print four lines, stating the protocol, host, port and path specified by the URL. If the port and/or path are not given in the URL, print the string <default>

www.acmicpc.net

🧑🏻‍💻 문제 풀이

단순하게 :// 으로 split 하면서 시작하면 ValueError 를 만나게 되는 문제입니다.

def get_url_infos(url):
    protocol = url.split("://")[0]
    
    extra = "://".join(url.split("://")[1:])
    
    extra_split = extra.split("/")
    
    host_port = extra_split[0].split(":")
    
    if len(host_port) > 1:
        host, port = host_port[0], host_port[1]
    else:
        host, port = host_port[0], "<default>"
        
    if len(extra_split) > 1:
        path = "/".join(extra_split[1:])
    else:
        path = "<default>"
    
    return protocol, host, port, path

먼저 입력 받은 URL 을 파싱하여 원하는 값인 protocol / host / port / path 값을 구하는 함수를 구합니다.

맨 처음 protocol 은 맨 처음에 :// 앞에 있는 값이므로

url 을 :// 으로 split 한 값 중 첫번째 값을 protocol 값으로 설정합니다.

protocol = url.split("://")[0]

split 하고 남은 값들은 다시 :// 으로 묶어 줍니다.

extra = "://".join(url.split("://")[1:])

이번에는 Host 값과 Port 값을 구하기 위하여 "/" 으로 split 한 뒤 나온 첫번째 값을 활용합니다.

그 첫번째 값을 다시 ":" 으로 split 하였을때 그 길이가 2 이상일 경우에는

첫번째 값을 host 두번째 값을 port 로 하고 

길이가 1일 경우에는 첫번째 값을 host <default> 값을 port 로 지정합니다.

host_port = extra_split[0].split(":")
    
if len(host_port) > 1:
    host, port = host_port[0], host_port[1]
else:
    host, port = host_port[0], "<default>"

그러고도 남은 값이 있으면 다 "/" 으로 묶어서 path 값으로 

그렇지 않으면 <default> 값을 path 로 합니다.

if len(extra_split) > 1:
    path = "/".join(extra_split[1:])
else:
    path = "<default>"

이렇게 구한 값을 가지고 dictionary 를 만들어줍니다.

def urls(url_list):
    url_info_dict = {}
    
    for url_idx, url in enumerate(url_list, start=1):
        protocol, host, port, path = get_url_infos(
            url=url
        )
        
        url_info_dict[f"URL #{url_idx}"] = {
            "Protocol": protocol,
            "Host": host,
            "Port": port,
            "Path": path
        }
        
    return url_info_dict

키 값은 URL #번호 / 나머지 값들은 키 - 밸류로 만들어줍니다.

def make_answer_string(url_info_dict):
    answer = []
    for url_info_key in url_info_dict.keys():
        url_string = [url_info_key]
        url_info = url_info_dict[url_info_key]
        
        for url_item in url_info.items():
            url_str = f"{url_item[0].ljust(9, ' ')}= {url_item[1]}"
            
            url_string.append(url_str)
            
        answer.append("\n".join(url_string))
        
    return "\n\n".join(answer)

이렇게 구한 값들을 가지고 정답문자열을 만들어줍니다.

 

각 키값들 뒤에 공백은 ljust 를 활용하였습니다.

 

전체 코드는 아래를 참고해주세요.

🧑🏻‍💻 코드 ( Solution )

def get_url_infos(url):
    protocol = url.split("://")[0]
    
    extra = "://".join(url.split("://")[1:])
    
    extra_split = extra.split("/")
    
    host_port = extra_split[0].split(":")
    
    if len(host_port) > 1:
        host, port = host_port[0], host_port[1]
    else:
        host, port = host_port[0], "<default>"
        
    if len(extra_split) > 1:
        path = "/".join(extra_split[1:])
    else:
        path = "<default>"
    
    return protocol, host, port, path

def urls(url_list):
    url_info_dict = {}
    
    for url_idx, url in enumerate(url_list, start=1):
        protocol, host, port, path = get_url_infos(
            url=url
        )
        
        url_info_dict[f"URL #{url_idx}"] = {
            "Protocol": protocol,
            "Host": host,
            "Port": port,
            "Path": path
        }
        
    return url_info_dict
        

def make_answer_string(url_info_dict):
    answer = []
    for url_info_key in url_info_dict.keys():
        url_string = [url_info_key]
        url_info = url_info_dict[url_info_key]
        
        for url_item in url_info.items():
            url_str = f"{url_item[0].ljust(9, ' ')}= {url_item[1]}"
            
            url_string.append(url_str)
            
        answer.append("\n".join(url_string))
        
    return "\n\n".join(answer)


if __name__ == "__main__":
    url_list = []
    
    for _ in range(int(input())):
        url = input()
        url_list.append(url)
        
    url_info_dict = urls(url_list=url_list)
    print(make_answer_string(url_info_dict=url_info_dict))
 

GitHub - SOMJANG/CODINGTEST_PRACTICE: 1일 1문제 since 2020.02.07

1일 1문제 since 2020.02.07. Contribute to SOMJANG/CODINGTEST_PRACTICE development by creating an account on GitHub.

github.com

Comments