문제:

N+1개의 I와 N개의 O로 이루어져 있으면, I와 O이 교대로 나오는 문자열을 Pn 이라고 한다.

 

P1 IOI

P2 IOIOI

P3 IOIOIOI

Pn IOIOI...OI (O가 N개)

 

I과 O로만 이루어진 문자열 S와 정수 N이 주어졌을 때, S안에 Pn이 몇 군데 포함되어 있는지 구하는 프로그램을 작성하시오.

입력:

첫째 줄에 N이 주어진다. 둘째 줄에는 S의 길이 M이 주어지며, 셋째 줄에 S가 주어진다. (1<=N<=1,000,000 , 2N+1 <= M <= 1,000,000)

출력:

S에 Pn이 몇 군데 포함되어 있는지 출력한다.

풀이방법:

Pn은 I와 O가 교대로 나오는 문자열이다. 따라서 index로 비교해서 IOI 패턴을 만족하는지 확인하고 이렇게 연속된 횟수를 세고 N과 일치할 경우 answer를 1 증가시킨다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
= int(input())
= int(input())
= input()
 
answer = 0
pattern = 0
= 1
while i < M-1:    
    if S[i-1]=='I' and S[i]=='O' and S[i+1]=='I':
        pattern +=1
        if pattern == N:
            pattern -=1
            answer +=1
        i+=1
    else:
        pattern = 0
    i+=1
print(answer)
cs

문제링크:

https://www.acmicpc.net/problem/5525

 

5525번: IOIOI

문제 N+1개의 I와 N개의 O로 이루어져 있으면, I와 O이 교대로 나오는 문자열을 PN이라고 한다. P1 IOI P2 IOIOI P3 IOIOIOI PN IOIOI...OI (O가 N개) I와 O로만 이루어진 문자열 S와 정수 N이 주어졌을 때, S안에 PN

www.acmicpc.net

 

'Algorithm > Python' 카테고리의 다른 글

[Programmers]2020 카카오 인턴십. 키패드 누르기  (0) 2020.07.07
[BOJ]1543. 문서 검색  (0) 2020.07.02
[BOJ]11652. 카드  (0) 2020.06.25
[BOJ]5052. 전화번호 목록  (0) 2020.06.23
[BOJ]12865. 평범한 배낭  (0) 2020.06.18

문제:

어떤 숫자 n이 자신을 제외한 모든 약수들의 합과 같으면, 그 수를 완전수라고 한다.

예를 들어 6은 6 = 1 + 2 + 3 으로 완전수이다.

n이 완전수인지 아닌지 판단해주는 프로그램을 작성하라.

입력:

입력은 테스트 케이스마다 한 줄 간격으로 n이 주어진다. (2 < n < 100,000)

입력의 마지막엔 -1이 주어진다.

출력:

테스트케이스마다 한줄에 하나씩 출력해야 한다.

n이 완전수라면, n을 n이 아닌 약수들의 합으로 나타내어 출력한다. (예제 출력 참고).

이때, 약수들은 오름차순으로 나열해야 한다.

n이 완전수가 아니라면 n is NOT perfect. 를 출력한다.

풀이방법:

약수들을 찾는 것은 어렵지 않으나 출력 요건을 주의 깊게 맞춰야 하는 문제인 것 같다.

약수들을 찾는 것은 브루트포스 방법으로 2부터 다 나눠보면서 나머지가 없는 값을 찾으면 된다. 이 때, 조금이라도 시간을 줄이기 위해서 n까지 다 나눠보는 것이 아닌 n//2-1까지 나눠보도록 했다. 이렇게 약수들을 모두 찾은 다음에 중복을 제거한 다음에 정렬을 했다. (중복은 제곱수를 위해 제거, 9와 같은 경우 1,3,3과 같이 들어가 있을 것)

약수들의 합이 n과 같으면 완전수이므로 출력 조건에 맞춰서 출력을 하고, 다르면 n is NOT perfect.로 출력한다.

100,000미만의 완전수는 6, 28, 496, 8128만 있으니 확인 후 제출하면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
while True:
    n=int(input())
    if n==-1:
        break
    factor=[1]
    for i in range(2,int(n//2)):
        if n%i==0 and i not in factor:
            factor.append(i)
            factor.append(n//i)
    factor=sorted(list(set(factor)))
    answer=""
    if sum(factor)==n:
        answer += "{} =".format(n)
        for i in range(len(factor)):
            answer += " {}".format(factor[i])
            if (i+1)!=len(factor):
                answer+=" +"
    else:
        answer = "{} is NOT perfect.".format(n)
    print(answer)
cs

문제링크:

https://www.acmicpc.net/problem/9506

 

9506번: 약수들의 합

문제 어떤 숫자 n이 자신을 제외한 모든 약수들의 합과 같으면, 그 수를 완전수라고 한다.  예를 들어 6은 6 = 1 + 2 + 3 으로 완전수이다. n이 완전수인지 아닌지 판단해주는 프로그램을 작성하라.

www.acmicpc.net

 

'Algorithm > Python' 카테고리의 다른 글

[BOJ]10830. 행렬 제곱  (0) 2020.06.16
[BOJ]1837. 암호제작  (0) 2020.06.11
[Programmers]2018 Kakao[1차]추석 트래픽  (0) 2020.05.26
[Programmers]2019 Kakao 불량 사용자  (0) 2020.05.21
[BOJ]2468. 안전 영역  (0) 2020.05.19

문제:

풀이방법:

문자열을 잘 parsing할 수 있는지와, 어느 시점에 최대가 되는지 알아야 하는 문제다.

 우선 문자열을 파싱하기 위해서 splitTime이라는 함수를 만들었고, 날짜, 시간, 처리시간은 공백으로 구분되어 있기 때문에 split해주고, 날짜는 항상 2016년 9월 15일로 고정되어 있기 때문에 사용하지 않는다. 시간은 다시한번 :로 구분되어 있기 때문에 split해주고 1초간 처리하는 요청의 최대 개수를 알아야 하기 때문에 시간을 1초 단위로 만들어준다. 처리시간은 초 단위로 나오고 항상 s로 끝나기 때문에 이를 제거한 다음에 float으로 만들어 준다. 그리고 처리시간은 시작시간과 끝시간을 포함하기 때문에 배열로 반환을 할 때 시작시간에 0.001만큼 더하도록 한다.

 보통 최대 개수인 부분은 시작시간이나 끝시간에서 발생하게 된다. 이 시간들을 기준으로 처리해야하는 데이터가 생성되거나 사라지기 때문이다. (배열의 모든 시간을 탐색해도 좋지만 시간이 오래 걸릴 것이다.) 각 트래픽별의 시작시간과 끝나는 시간을 기준으로 트래픽의 갯수를 세서 최대 갯수를 파악한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
def splitTime(line):
    strings = line.split()
    end = strings[1]
    duration = float(strings[2][:-1])
    times = end.split(":")
    time = int(times[0])*3600
    time += int(times[1])*60
    time += float(times[2])
    return [time-duration+0.001,time]
 
def check(times,traffic):
    count = 0
    for time in times:
        temp = 0
        start = time
        end = time +1
        for t in traffic:
            if t[1]>= start and t[0]<end:
                temp+=1
        count=max(count,temp)
    return count
    
 
def solution(lines):
    traffic=[]
    answer=[]
    for line in lines:
        traffic.append(splitTime(line))
    for t in traffic:
        answer.append(check(t,traffic))
    return max(answer)
cs

 

문제링크:

https://programmers.co.kr/learn/courses/30/lessons/17676?language=python3

 

코딩테스트 연습 - [1차] 추석 트래픽

입력: [ 2016-09-15 20:59:57.421 0.351s, 2016-09-15 20:59:58.233 1.181s, 2016-09-15 20:59:58.299 0.8s, 2016-09-15 20:59:58.688 1.041s, 2016-09-15 20:59:59.591 1.412s, 2016-09-15 21:00:00.464 1.466s, 2016-09-15 21:00:00.741 1.581s, 2016-09-15 21:00:00.748

programmers.co.kr

 

'Algorithm > Python' 카테고리의 다른 글

[BOJ]1837. 암호제작  (0) 2020.06.11
[BOJ]9506. 약수들의 합  (0) 2020.06.09
[Programmers]2019 Kakao 불량 사용자  (0) 2020.05.21
[BOJ]2468. 안전 영역  (0) 2020.05.19
[BOJ]2167. 2차원 배열의 합  (0) 2020.05.14

문제:

풀이방법:

 문자열을 처리하고 규칙에 따라 정리를 하면 되는 문제이다.

우선 양 끝은 {{~~}}으로 고정이 되어 있다. 따라서 슬라이싱을 통해서 이 부분을 떼어내고 숫자들을 구분하기 위해서    '}.{'로 split을 한다. 이렇게 하면 ['2', '2,1' , '2,1,3' , '2,1,3,4'] 와 같이 분리되게 된다.

 반복문으로 순환을 하면서 다시 ','을 기준으로 분리를 하면 숫자만 남게 되는데 이를 각 원소값이 int인 list로 tuples에 정리하게 된다. 이 단계까지 마치면 문자열을 규칙에 적용할 수 있도록 정리가 마무리 되었다.

 

규칙은 다음과 같다.

1. 각 list들을 길이가 짧은 순으로 정렬을 한다.

2. list의 숫자 값을 탐색하며 answer list에 없는 값이라면 answer에 넣고 break를 한 뒤 다음 list를 탐색한다.

 

따라서 이 규칙을 끝까지 적용하면 answer를 얻을 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def solution(s):
    answer=[]
    splitS=s[2:-2].split("},{")
    tuples=[]
    for S in splitS:
        parser=S.split(',')
        tuples.append(list(map(int,parser)))
    tuples.sort(key = len)
    for tu in tuples:
        for t in tu:
            if t not in answer:
                answer.append(t)
                break
    return answer
cs

문제링크:

https://programmers.co.kr/learn/courses/30/lessons/64065

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

'Algorithm > Python' 카테고리의 다른 글

[BOJ]1350. 진짜 공간  (0) 2020.05.12
[BOJ]5014. 스타트링크  (0) 2020.05.07
[2019 Kakao winter internship]크레인 인형뽑기 게임  (0) 2020.04.21
[BOJ]2863. 이게 분수?  (0) 2020.04.16
[BOJ]7785. 회사에 있는 사람  (0) 2020.04.14

문제:

풀이방법:

우선 파일명을 HEAD, NUMBER, TAIL로 정리를 해야한다. 이를 위해서 isdigit이라는 숫자인지 확인하는 함수를 사용한다.

 처음 isdigit이 참이 되는 순간 이전까지의 글자가 HEAD가 되므로 isdigit이 참이 되는 순간 parser에 값을 추가하고 break를 걸어서 반복문을 나온다. 

 해당 위치부터 다시 반복문을 사용해서 이번에는 isdigit이 거짓이 되는 순간이 NUMBER의 끝이므로 parser에 값을 추가하고 break를 걸어서 반복문을 나온다.

 이제 남은 부분은 TAIL에 해당하므로 parser에 추가해주면 되지만 TAIL이 아무것도 없을 경우에는 위 NUMBER를 파악하는 과정에서 맨 마지막 숫자가 추가되지 못했을 것이다. 따라서 해당 인덱스에 isdigit을 사용해서 참이면 TAIL이 없는 경우, 거짓이면 TAIL이 있는 경우를 의미한다.

 이제 파일명을 HEAD, NUMBER, TAIL로 나눴으므로 sort의 key를 사용해서 정렬을 하도록 한다. 우선 HEAD를 기준으로 사전 순 정렬을 하고, 대소문자 구별을 하지 않는다. 그리고 HEAD가 동일하다면 NUMBER가 작은순으로 정렬을 하는데 스트링 상태가 아닌 int 상태로 변환해서 정렬을 해야 한다. 따라서 sort의 key는 (x[0].upper(), int(x[1])) 이 된다. 이처럼 해야지 원래 파일명을 보존하면서 정렬을 할 수 있다.

 정렬을 완료했으므로 이를 다시 붙여서 출력을 해야 한다. TAIL이 있는 경우에는 parser에 2번째 인덱스가 존재하지만 없다면 1까지만 존재한다. 따라서 이를 try~ except ~ 예외처리 구문을 사용해서 추가하도록 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def solution(files):
    parser=[]
    for idx,file in enumerate(files):
        parser.append([])
        for i,f in enumerate(file):
            if f.isdigit():
                parser[idx].append(file[:i])
                break
        for i1 in range(i,len(file)):
            if not file[i1].isdigit():
                parser[idx].append(file[i:i1])
                break
        if file[i1].isdigit():
            parser[idx].append(file[i:])
        else:
            parser[idx].append(file[i1:])
    parser.sort(key=lambda x: (x[0].upper(),int(x[1])))
    answer=[]
    for parse in parser:
        try:
            answer.append(parse[0]+parse[1]+parse[2])
        except:
            answer.append(parse[0]+parse[1])
    return answer
cs

문제링크:

https://programmers.co.kr/learn/courses/30/lessons/17686

 

코딩테스트 연습 - [3차] 파일명 정렬 | 프로그래머스

파일명 정렬 세 차례의 코딩 테스트와 두 차례의 면접이라는 기나긴 블라인드 공채를 무사히 통과해 카카오에 입사한 무지는 파일 저장소 서버 관리를 맡게 되었다. 저장소 서버에는 프로그램의 과거 버전을 모두 담고 있어, 이름 순으로 정렬된 파일 목록은 보기가 불편했다. 파일을 이름 순으로 정렬하면 나중에 만들어진 ver-10.zip이 ver-9.zip보다 먼저 표시되기 때문이다. 버전 번호 외에도 숫자가 포함된 파일 목록은 여러 면에서 관리하기 불편했다. 예

programmers.co.kr

 

문제:

풀이방법:

LZW 압축 과정대로 코드를 작성하면 된다.

 우선 길이가 1인 모든 단어를 포함해서 사전을 구축해야 하므로 dictionary에 밑과 같이 구축한다. 그 뒤에 idx가 입력으로 들어온 문자열의 길이와 같아질 때까지 반복해서 확인하고 추가하는 작업을 한다.

 LZW 압축과정은 다음과 같이 작동된다.

1. KAKAO의 경우에 KAKAO와 인덱스 0 그리고 사전이 check로 입력된다.

2. 이를 뒤에서부터 비교를 한다. 즉 KAKAO가 사전에 있는가? -> KAKA가 사전에 있는가? -> .... 순으로 진행이 되고 K가 사전에 있는가에서 참이므로 break를 걸고 반복문 밖으로 나온다.

3. 그러면 KA는 사전에 없는 단어였으므로 사전에 추가하고 인덱스와 사전을 반환한다.

4. check에서 나온 인덱스와 check에 넣기 전에 사용한 인덱스를 사용해서 슬라이싱을 하고 이를 사전의 색인 번호를 answer에 추가한다.

5. idx를 i로 지정한다.

 idx가 msg와 동일할 떄까지 진행을 하면 압축과정이 끝나게 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def check(msg,idx,dictionary):
    for i in range(len(msg),idx,-1):
        if msg[idx:i] in dictionary:
            break
    dictionary.append(msg[idx:i+1])
    return i,dictionary
        
 
def solution(msg):
    dictionary=[' ','A','B','C','D','E','F','G','H','I','J',
                'K','L','M','N','O','P','Q','R','S','T','U',
                'V','W','X','Y','Z']
    answer=[]
    idx=0
    while len(msg)!=idx:
        i,dictionary=check(msg,idx,dictionary)
        answer.append(dictionary.index(msg[idx:i]))
        idx=i
    return answer
cs

문제링크:

https://programmers.co.kr/learn/courses/30/lessons/17684

 

코딩테스트 연습 - [3차] 압축 | 프로그래머스

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

programmers.co.kr

 

문제:

풀이방법:

 이 문제에서 처리해야 할 것은 크게 두 가지이다. 재생된 시간의 길이에 따라서 음이 달라지므로 시간 형식으로 되어 있는 자료형을 분 단위로 바꿔야 한다. 그리고 음계 중에 C#, D#, F#, G#과 같이 #이 붙어 있는 음계가 있는데 스트링 형식으로 되어 있기 때문에 이들도 하나의 인덱스를 차지하고 있으므로 처리하는 방법에 대해서 생각해야 한다.

 우선 분으로 바꾸기 위해서 :를 기준으로 분할을 한다. 시작하는 분과 끝나는 분을 비교해서 음악의 총 재생된 시간을 구하도록 한다.

 C#과 같이 #이 달려있는 음들은 하나의 인덱스로 처리를 하는 것이 편하므로 소문자로 변경하도록 한다. (C#->c , D# ->d , ....) 이 작업을 하고 위에서 구한 재생된 시간으로 실제 재생된 멜로디를 구할 수 있고, 이 안에 m이 있는지 판단하여서 answers 리스트에 담도록 한다. 

 이 때 조건이 일치하는 음악이 여러 개일 경우에는 재생된 시간이 제일 긴 음악, 먼저 입력된 음악 제목 순으로 정렬해야 하므로 (재생된 시간, 입력된 인덱스,음악제목)과 같이 answers에 넣도록 한다.

 일치하는 음악을 모두 담았다면 sort의 key를 이용해서 위 조건에 맞게 정렬을 하도록 한다. 재생된 시간은 길수록 앞으로 와야 하므로 음수를 붙여주고, 먼저 입력된 것이 앞으로 와야 하므로 이는 양수로 정렬하도록 한다. 이렇게 정렬을 하고 난 뒤에 answers에 가장 앞에 있는 값의 맨 마지막 값을 출력한다면 그것이 음악제목일 것이다. (만약 answers가 비어 있다면 "(None)"을 출력해야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
def change(m,music):
    be=["C#","D#","F#","G#","A#"]
    af=["c","d","f","g","a"]
    for i in range(len(be)):
        m=m.replace(be[i],af[i])
        music=music.replace(be[i],af[i])
    return m,music
 
def solution(m,musicinfos):
    answers=[]
    for idx,musicinfo in enumerate(musicinfos):
        start,end,title,music = musicinfo.split(',')
        startH,startM=map(int,start.split(":"))
        endH,endM=map(int,end.split(":"))
        if endM-startM < 0:
            minute=endM-startM+60
            endH-=1
        else:
            minute=endM-startM
        length=(endH-startH)*60+minute
        m,music=change(m,music)
        p,r=divmod(length,len(music))
        melody=music*p+music[:r]
        if m in melody:
            answers.append((length,idx,title))
    if len(answers):
        answers.sort(key=lambda x:(-x[0],x[1]))
        return answers[0][-1]
    else:
        return "(None)"
cs

 

문제링크:

https://programmers.co.kr/learn/courses/30/lessons/17683

 

코딩테스트 연습 - [3차] 방금그곡 | 프로그래머스

방금그곡 라디오를 자주 듣는 네오는 라디오에서 방금 나왔던 음악이 무슨 음악인지 궁금해질 때가 많다. 그럴 때 네오는 다음 포털의 '방금그곡' 서비스를 이용하곤 한다. 방금그곡에서는 TV, 라디오 등에서 나온 음악에 관해 제목 등의 정보를 제공하는 서비스이다. 네오는 자신이 기억한 멜로디를 가지고 방금그곡을 이용해 음악을 찾는다. 그런데 라디오 방송에서는 한 음악을 반복해서 재생할 때도 있어서 네오가 기억하고 있는 멜로디는 음악 끝부분과 처음 부분이 이어

programmers.co.kr

 

'Algorithm > Python' 카테고리의 다른 글

[Programmers]2018 Kakao.파일명 정렬  (0) 2019.12.03
[Programmers]2018 Kakao.압축  (0) 2019.12.02
[Programmers]2020 Kakao.괄호 변환  (0) 2019.11.15
[Programmers]2020 Kakao. 문자열 압축  (0) 2019.11.14
[BOJ]2358. 평행선  (0) 2019.11.13

문제:

풀이방법:

 처음에는 스택으로 구축할까 생각하다가 많이 복잡할 것 같아서 슬라이싱을 활용한 문자열 비교로 해결하기로 하였다. 

문자열의 길이가 1이면 항상 답은 1이라는 예외처리로 시작한다. 몇 개 단위로 자르는 것이 가장 짧은 방법인지 알지 못하므로 1부터 len(s)까지 분할 하도록 한다. i개의 단어로 자르면서 앞과 현재가 같다면 count를 하나올려주도록 한다. 만약 다르다면 count를 비교해보도록 한다. count가 1이라면 그냥 문자열에 더하고, 1이 아니라면 숫자를 같이 더해주도록 한다.

 이렇게 각 길이의 단위로 자른 문자열을 모두 담았다면 가장 작은 값을 반환하도록 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
def solution(s):
    answers=[]
    if len(s)==1:
        return 1
    for i in range(1,len(s)):
        answer = ''
        count = 1
        for j in range(i,len(s),i):
            if s[j-i:j]==s[j:j+i]:
                count+=1
            else:
                if count==1:
                    answer+=s[j-i:j]
                else:
                    answer+=str(count)+s[j-i:j]
                    count=1
        if len(s[j:j+i])==i:
            if count==1:
                answer+=s[j-i:j]
            else:
                answer+=str(count)+s[j-i:j]
                count=1
        else:
            answer+=s[j:j+i]
        answers.append(len(answer))
    return min(answers)
cs

 

문제링크:

https://programmers.co.kr/learn/courses/30/lessons/60057

 

코딩테스트 연습 - 문자열 압축 | 프로그래머스

데이터 처리 전문가가 되고 싶은 어피치는 문자열을 압축하는 방법에 대해 공부를 하고 있습니다. 최근에 대량의 데이터 처리를 위한 간단한 비손실 압축 방법에 대해 공부를 하고 있는데, 문자열에서 같은 값이 연속해서 나타나는 것을 그 문자의 개수와 반복되는 값으로 표현하여 더 짧은 문자열로 줄여서 표현하는 알고리즘을 공부하고 있습니다. 간단한 예로 aabbaccc의 경우 2a2ba3c(문자가 반복되지 않아 한번만 나타난 경우 1은 생략함)와 같이 표현할 수

programmers.co.kr

 

'Algorithm > Python' 카테고리의 다른 글

[Programmers]2018 Kakao.방금그곡  (0) 2019.12.01
[Programmers]2020 Kakao.괄호 변환  (0) 2019.11.15
[BOJ]2358. 평행선  (0) 2019.11.13
[BOJ]GIT- 정리  (0) 2019.11.12
[BOJ]1937. 욕심쟁이 판다  (0) 2019.11.11

문제:

풀이방법:

아이디에 따른 명령어와 이름을 해시 방식으로 저장을 해줌으로써 데이터를 관리하였다. 이름을 바꾸는 경우에는 맨마지막에 해당하는 이름으로 모두 반영이 되므로 Change가 나올 때마다 덮어주는 방식으로 진행하였다. 이 외에는 명령어에 따라서 알맞게 출력해주면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def solution(record):
    command=[]
    name={}
    for re in record:
        temp=re.split()
        if temp[0]=='Change':
            name[temp[1]]=temp[2]
        else:
            if temp[0]=='Enter':
                name[temp[1]]=temp[2]
            command.append((temp[0],temp[1]))
    answer=[]
    for cmd in command:
        if cmd[0]=="Enter":
            answer.append("{}님이 들어왔습니다.".format(name[cmd[1]]))
        else:
            answer.append("{}님이 나갔습니다.".format(name[cmd[1]]))
    return answer
cs

문제링크:

https://programmers.co.kr/learn/courses/30/lessons/42888

문제:

 창영이는 민균이의 컴퓨터를 해킹해 텍스트 파일 하나를 자신의 메일로 전송했다. 파일에는 단어가 한 줄에 하나씩 적혀있었고, 이 중 하나는 민균이가 온라인 저지에서 사용하는 비밀번호이다.

 

파일을 살펴보던 창영이는 모든 단어의 길이가 홀수라는 사실을 알아내었다. 그리고 언젠가 민균이가 이 목록에 대해서 얘기했던 것을 생각해냈다. 민균이의 비밀번호는 목록에 포함되어 있으며, 비밀번호를 뒤집어서 쓴 문자열도 포함되어 있다.

 

예를 들어, 민균이의 비밀번호가 "tulipan"인 경우에 목록에는 "napilut"도 존재해야 한다. 알 수 없는 이유에 의해 모두 비밀번호로 사용 가능하다고 한다.

 

민균이의 파일에 적혀있는 단어가 모두 주어졌을 때, 비밀번호의 길이와 가운데 글자를 출력하는 프로그램을 작성하시오.

 

입력:

첫째 줄에 단어의 수 N(2<=N<=100)이 주어진다. 다음 N개의 줄에는 파일에 적혀있는 단어가 한 줄에 하나씩 주어진다.

단어는 알파벳 소문자로만 이루어져 있으며, 길이는 2보다 크고 14보다 작은 홀수이다.

 

출력:

첫째 줄에 비밀번호의 길이와 가운데 글자를 출력한다. 항상 답이 유일한 경우만 입력으로 주어진다.

 

풀이방법:

 처음 단어를 받을때 원래 단어와 뒤집은 단어 두개씩 넣도록 하였다. 이렇게 한다면 비밀번호인 단어는 words라는 배열에 두 개씩 담기게 될 것이다.

 그리고 이 words라는 배열에 set을 취하게 되면 중복인 것들이 사라지게 되고, words에 set을 한번 한 배열을 빼면 비밀번호인 문자만 남게 될 것이다. 항상 홀수 길이의 단어이므로 둘 중 어느것의 가운데 글자를 출력해도 상관없으니 아무 것이나 선택해서 출력하도록 했다.

1
2
3
4
5
6
7
8
9
10
words=[]
for i in range(int(input())):
    word=input()
    ReWord=word[::-1]
    words.append(word)
    words.append(ReWord)
 
for word in list(set(words)):
    words.remove(word)
print(len(words[0]),words[0][len(words[0])//2])
cs

문제링크:

https://www.acmicpc.net/problem/9933

'Algorithm > Python' 카테고리의 다른 글

[BOJ]14501. 퇴사  (0) 2019.09.11
[BOJ]1371. 가장 많은 글자  (0) 2019.09.10
[BOJ]2178. 미로찾기  (0) 2019.09.08
[BOJ]2667. 단지번호붙이기  (0) 2019.09.07
[BOJ]2331. 반복 수열  (6) 2019.09.06

+ Recent posts