no image
해커스쿨 trainer
trainer2의 비밀번호는 linuxer 입니다. trainer3의 비밀번호는 computer 입니다. trainer4의 비밀번호는 mungguta 입니다. trainer5의 비밀번호는 goodluck 입니다. trainer6의 비밀번호는 coffee 입니다. trainer7의 비밀번호는 to the top 입니다. trainer8의 비밀번호는 player 입니다. trainer9의 비밀번호는 programming 입니다. trainer10의 비밀번호는 best! 입니다. trainer 1 [접속 ID@서버 현재위치] ls(list) 명령어 옵션 -a(all): 숨겨진 파일이나 디렉토리를 보여줌 (숨김 파일은 파일 이름 앞에 .이 들어감) -l(long): 자세한 내용을 출력함 (권한, 링크 수, 소유..
2020.07.18
백준 1920번: 수 찾기
https://www.acmicpc.net/problem/1920 1920번: 수 찾기 첫째 줄에 자연수 N(1≤N≤100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1≤M≤100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들이 A안�� www.acmicpc.net 문제 N개의 정수 A[1], A[2], …, A[N]이 주어져 있을 때, 이 안에 X라는 정수가 존재하는지 알아내는 프로그램을 작성하시오. 입력 첫째 줄에 자연수 N(1≤N≤100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1≤M≤100,000)이 주어진다. 다음 줄에는 M개의 수들이 ..
2020.07.15
백준 2869번: 달팽이는 올라가고 싶다
https://www.acmicpc.net/problem/2869 2869번: 달팽이는 올라가고 싶다 문제 땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다. 달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 �� www.acmicpc.net 문제 땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다. 달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 후에는 미끄러지지 않는다. 달팽이가 나무 막대를 모두 올라가려면, 며칠이 걸리는지 구하는 프로그램을 작성하시오. 코드 def check(day): # day일이 지난 후 도착하는지 체..
2020.07.15
프로그래머스 입국심사
https://programmers.co.kr/learn/courses/30/lessons/43238 코딩테스트 연습 - 입국심사 n명이 입국심사를 위해 줄을 서서 기다리고 있습니다. 각 입국심사대에 있는 심사관마다 심사하는데 걸리는 시간은 다릅니다. 처음에 모든 심사대는 비어있습니다. 한 심사대에서는 동시에 한 � programmers.co.kr 문제 n명이 입국심사를 위해 줄을 서서 기다리고 있습니다. 각 입국심사대에 있는 심사관마다 심사하는데 걸리는 시간은 다릅니다. 처음에 모든 심사대는 비어있습니다. 한 심사대에서는 동시에 한 명만 심사를 할 수 있습니다. 가장 앞에 서 있는 사람은 비어 있는 심사대로 가서 심사를 받을 수 있습니다. 하지만 더 빨리 끝나는 심사대가 있으면 기다렸다가 그곳으로 가서..
2020.07.09
프로그래머스 예산
https://programmers.co.kr/learn/courses/30/lessons/43237 코딩테스트 연습 - 예산 국가의 역할 중 하나는 여러 지방의 예산요청을 심사하여 국가의 예산을 분배하는 것입니다. 국가예산의 총액은 미리 정해져 있어서 모든 예산요청을 배정해 주기는 어려울 수도 있습니다. 그�� programmers.co.kr 문제 국가의 역할 중 하나는 여러 지방의 예산요청을 심사하여 국가의 예산을 분배하는 것입니다. 국가예산의 총액은 미리 정해져 있어서 모든 예산요청을 배정해 주기는 어려울 수도 있습니다. 그래서 정해진 총액 이하에서 가능한 한 최대의 총 예산을 다음과 같은 방법으로 배정합니다. 1. 모든 요청이 배정될 수 있는 경우에는 요청한 금액을 그대로 배정합니다. 2. 모든 ..
2020.07.09
프로그래머스 H-Index
https://programmers.co.kr/learn/courses/30/lessons/42747 코딩테스트 연습 - H-Index H-Index는 과학자의 생산성과 영향력을 나타내는 지표입니다. 어느 과학자의 H-Index를 나타내는 값인 h를 구하려고 합니다. 위키백과1에 따르면, H-Index는 다음과 같이 구합니다. 어떤 과학자가 발표 programmers.co.kr 문제 H-Index는 과학자의 생산성과 영향력을 나타내는 지표입니다. 어느 과학자의 H-Index를 나타내는 값인 h를 구하려고 합니다. 위키백과1에 따르면, H-Index는 다음과 같이 구합니다. 어떤 과학자가 발표한 논문 n편 중, h번 이상 인용된 논문이 h편 이상이고 나머지 논문이 h번 이하 인용되었다면 h의 최댓값이 이 ..
2020.07.09
프로그래머스 2018 KAKAO BLIND RECRUITMENT [3차] n진수 게임
https://programmers.co.kr/learn/courses/30/lessons/17687 코딩테스트 연습 - [3차] n진수 게임 N진수 게임 튜브가 활동하는 코딩 동아리에서는 전통적으로 해오는 게임이 있다. 이 게임은 여러 사람이 둥글게 앉아서 숫자를 하나씩 차례대로 말하는 게임인데, 규칙은 다음과 같다. 숫자를 0� programmers.co.kr 문제 튜브가 활동하는 코딩 동아리에서는 전통적으로 해오는 게임이 있다. 이 게임은 여러 사람이 둥글게 앉아서 숫자를 하나씩 차례대로 말하는 게임인데, 규칙은 다음과 같다. 숫자를 0부터 시작해서 차례대로 말한다. 첫 번째 사람은 0, 두 번째 사람은 1, … 열 번째 사람은 9를 말한다. 10 이상의 숫자부터는 한 자리씩 끊어서 말한다. 즉 열..
2020.07.09
프로그래머스 베스트앨범
https://programmers.co.kr/learn/courses/30/lessons/42579 코딩테스트 연습 - 베스트앨범 스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가 �� programmers.co.kr 문제 스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가 많이 재생된 장르를 먼저 수록합니다. 장르 내에서 많이 재생된 노래를 먼저 수록합니다. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수..
2020.07.09
trainer2의 비밀번호는 linuxer 입니다.
trainer3의 비밀번호는 computer 입니다.
trainer4의 비밀번호는 mungguta 입니다.
trainer5의 비밀번호는 goodluck 입니다.
trainer6의 비밀번호는 coffee 입니다.
trainer7의 비밀번호는 to the top 입니다.
trainer8의 비밀번호는 player 입니다.
trainer9의 비밀번호는 programming 입니다.
trainer10의 비밀번호는 best! 입니다.

 

trainer 1

 

 [접속 ID@서버 현재위치]

 

 ls(list) 명령어

 옵션

 -a(all): 숨겨진 파일이나 디렉토리를 보여줌 (숨김 파일은 파일 이름 앞에 .이 들어감)

 -l(long): 자세한 내용을 출력함 (권한, 링크 수, 소유자, 크기, 마지막 접근 일자, 등)

 

 파일 맨 앞의 문자가 d이면 디렉토리, -이면 파일

 

 

 

trainer 2

 

 pwd(print working directory): 현재 디렉토리의 절대 경로 출력

 

 cd(change directory): 디렉토리 이동

 .: 현재 폴더

 ..: 상위 폴더

 /: 최상위 디렉토리

 절대경로(최상위 디렉토리에서 시작), 상대경로(현재 디렉토리에서 시작)를 사용해서도 이동 가능

 

 mkdir: 폴더 생성

 rmdir: 폴더 삭제 (-r 옵션: 디렉토리와 하위 내용들을 재귀적으로 삭제, -f 옵션: 알림 메시지 표시하지 않음)

 

 cp file1 file2: file1을 복사하여 file2 생성

 cp file dir: 파일을 디렉토리로 복사

 cp -r dir1 dir2: 디렉토리 복사

 

 rm: 파일 삭제

 

 mv: 파일 이동 (파일 이름을 변경할 때도 쓰임)

 

 

 

trainer 3

 

 w: 서버 정보와 함께 사용자 정보를 자세히 알려줌

 (서버의 현재 시각, 서버 부팅 이후 시스템 작동시간, 서버 접속자 총 수, 접속자별 서버 평균부하율, 접속자별 계정/접속 TTY/접속 IP/로그인 시각/CPU 사용정보, 접속자별 현재 사용자 명령어 정보)

 

 finger: 사용자 정보 출력

 -l 옵션: 멀티라인 형식으로 사용자 홈 디렉토리, 집 전화번호, 로그인 쉘, 메일 상태 등과 함께 -s 옵션으로 보이는 정보 출력

 -s 옵션: 사용자의 로그인 이름, 실제 이름, 터미널 이름, 상태, idle 시간, 로그인 시간, 사무실 위치, 사무실 전화 출력

 

 tty: 자신의 터미널 확인

 

 ifconfig: 네트워크 인터페이스 설정 확인, 주로 IP 주소를 확인하는데 사용

 

 write: 로그인 중인 특정한 사용자에게 메시지를 전달

 

 wall: 모든 로그인된 사용자들에게 메시지를 전달

 

 

 

trainer 4

 

bin : 가장 필수적인 리눅스 실행 파일 (기본적인 실행 파일)

boot : 리눅스 부팅 관련 파일과 커널

dev : 하드웨어에 관한 정보

etc : 패스워드 파일, 쉐도우 파일, 리눅스 설정 파일 등 (리눅스의 설정 파일)

/etc/passwd : 사용자들에 대한 간단한 정보

/etc/shadow : 사용자들의 패스워드 (아무나 보지 못함)

/etc/services : 어떤 서비스를 하는중인지 보여줌

/etc/issue.net : 처음 접속될 때 나오는 화면

/etc/motd : 로그인 후에 나오는 메세지

~/public_html : 각 사용자들의 홈페이지 파일

home : 일반 사용자들의 디렉토리가 들어가는 곳 (일반 사용자들의 아이디와 작업공간)

lib : 라이브러리 파일

mnt : mount 명령을 사용하여 마운트 시킨 시디롬, 플로피 디스켓 등이 들어가는 디렉토리

proc : 프로세스들이 저장

root : 루트의 홈 디렉토리

sbin : 기본 명령을 제외한 시스템 관리용 실행파일

tmp : 임시로 파일을 저장하는 디렉토리 (누구나 이 디렉토리에 파일 생성 가능)

usr : 다양한 응용 프로그램들이 설치되어 있는 곳

var : 시스템 운영 중 생성 되는 각종 임시 파일과 외부 접속에 대한 로그 파일

 

 

 

trainer 5

 

 whoami: 자신의 기본 정보

 

 id : 자신의 자세한 기본 정보

 

 /etc/passwd: 서버의 모든 사용자들의 정보

 

 uname -a: 리눅스의 커널 버전

 

 cat /etc/*release : 설치된 OS의 버전

 

 rpm -qa : 설치된 패키지 정보


 cat /proc/cpuinfo : cpu 정보

 

 

 

trainer 6

 

 cat: 파일 내용 출력 (-n 옵션: 행 번호 표시)

 

패스워드 파일 정보

사용자명:패스워드(암호화된 문자열):사용자 계정 uid:사용자 계정 uid:사용자 계정 이름:사용자 홈 디렉토리:사용자 계정 로그인 쉘

 

 

 

trainer 7

 

 tar: 파일을 묶는 것(archive)

 gzip: 파일을 압축(compress)

 

 ※ 리눅스 압축 확장자
 tar : tar 프로그램을 사용하여 압축된 파일 (cvf: 합치기, xvf: 해제하기)
 gz : gzip 프로그램을 사용하여 압축된 파일 (-d: 파일 압축 해제)
 tar.gz : tar 프로그램으로 합친 후 gzip으로 압축한 파일
 tgz : tar.gz와 동일

 

 

 

trainer 8

 

 cat > file: 파일 생성

 

 cat >> file: 파일의 끝에 내용 추가

 

 

 gcc -o 프로그램이름 소스파일이름: c언어 컴파일

 

 절대경로 또는 상대경로(./프로그램이름)을 사용하여 파일 실행

 

 

 

trainer 9

 

 uid: user id, gid: group id, groups: 현재 속한 그룹

 

 파일 권한

 순서대로 user, group, others 권한 (소유자 권한, 그룹 사용자 권한, 기타 사용자 권한)

 rwx는 파일의 권한을 나타냄 (r: read, w: write, x: excute)

 

 

 

 

trainer 10

 

 Local 해킹 : 관리자 권한(root)를 얻고자 시도
 Remote 해킹 : 일반 아이디를 얻을때
 SetUID : 일시적으로 자신의 ID를 변경하는 것 (잠시동안 root 권한을 가질 수 있음) (s)

 ※ passwd 파일에는 SetUID가 걸려있음

 

 find / -perm -4000 : 서버 전체에서 SetUID가 걸린 파일 찾기

 -perm : 권한과 일치하는 파일을 찾는다
 -name : 이름과 일치하는 파일을 찾는다
 -user : 유저와 일치하는 파일을 찾는다
 -group : 그룹과 일치하는 파일을 찾는다

 

 

 

728x90

'CTF > 시스템' 카테고리의 다른 글

해커스쿨 FTZ level5  (0) 2020.08.15
해커스쿨 FTZ level4  (0) 2020.08.08
해커스쿨 FTZ level3  (0) 2020.08.06
해커스쿨 FTZ level2  (0) 2020.08.01
해커스쿨 FTZ level1  (0) 2020.07.23

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

 

1920번: 수 찾기

첫째 줄에 자연수 N(1≤N≤100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1≤M≤100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들이 A안��

www.acmicpc.net

 

 

 

 

문제

 

N개의 정수 A[1], A[2], …, A[N]이 주어져 있을 때, 이 안에 X라는 정수가 존재하는지 알아내는 프로그램을 작성하시오.

 

 

입력

 

첫째 줄에 자연수 N(1≤N≤100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1≤M≤100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들이 A안에 존재하는지 알아내면 된다. 모든 정수의 범위는 -2^31 보다 크거나 같고 2^31보다 작다.

 

 

출력

 

M개의 줄에 답을 출력한다. 존재하면 1을, 존재하지 않으면 0을 출력한다.

 

 

 

 

A 배열을 정렬한 후 이분 탐색으로 값이 존재하는지 검사한다. 

 

 

 

코드

 

if __name__=="__main__":
    n=int(input())
    a=list(map(int, input().split()))
    a.sort()
    m=int(input())
    b=list(map(int, input().split()))
    for i in range(m):
        lt=0
        rt=n-1
        while lt<=rt:
            mid=(lt+rt)//2
            if a[mid]==b[i]:
                print("1")
                break
            elif a[mid]>b[i]:
                rt=mid-1
            else:
                lt=mid+1
        else:
            print("0")
728x90

'알고리즘 > 백준' 카테고리의 다른 글

백준 3085번: 사탕 게임  (0) 2020.11.10
백준 9093번: 단어 뒤집기  (0) 2020.11.03
백준 2869번: 달팽이는 올라가고 싶다  (0) 2020.07.15
백준 9466번: 텀 프로젝트  (0) 2020.05.18
백준 2331번: 반복수열  (0) 2020.05.18

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

 

2869번: 달팽이는 올라가고 싶다

문제 땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다. 달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 ��

www.acmicpc.net

 

 

 

문제

 

땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다.

달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 후에는 미끄러지지 않는다.

달팽이가 나무 막대를 모두 올라가려면, 며칠이 걸리는지 구하는 프로그램을 작성하시오.

 

 

 

 

코드

 

def check(day):
	# day일이 지난 후 도착하는지 체크
    if a*day-b*(day-1)>=v:
        return True
    else:
        return False

if __name__=="__main__":
    a, b, v=map(int, input().split())
    lt=0
    rt=v
    ans=0
    while lt<=rt:
        mid=(lt+rt)//2
        # 도착한다면 날짜를 더 줄여서 검색
        if check(mid)==True:
            ans=mid
            rt=mid-1
        # 도착하지 않는다면 날짜를 더 늘려서 검색
        else:
            lt=mid+1
    print(ans)
728x90

'알고리즘 > 백준' 카테고리의 다른 글

백준 9093번: 단어 뒤집기  (0) 2020.11.03
백준 1920번: 수 찾기  (0) 2020.07.15
백준 9466번: 텀 프로젝트  (0) 2020.05.18
백준 2331번: 반복수열  (0) 2020.05.18
백준 10451번: 순열 사이클  (0) 2020.05.18

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

 

코딩테스트 연습 - 입국심사

n명이 입국심사를 위해 줄을 서서 기다리고 있습니다. 각 입국심사대에 있는 심사관마다 심사하는데 걸리는 시간은 다릅니다. 처음에 모든 심사대는 비어있습니다. 한 심사대에서는 동시에 한 �

programmers.co.kr

 

 

문제

 

n명이 입국심사를 위해 줄을 서서 기다리고 있습니다. 각 입국심사대에 있는 심사관마다 심사하는데 걸리는 시간은 다릅니다.

처음에 모든 심사대는 비어있습니다. 한 심사대에서는 동시에 한 명만 심사를 할 수 있습니다. 가장 앞에 서 있는 사람은 비어 있는 심사대로 가서 심사를 받을 수 있습니다. 하지만 더 빨리 끝나는 심사대가 있으면 기다렸다가 그곳으로 가서 심사를 받을 수도 있습니다.

모든 사람이 심사를 받는데 걸리는 시간을 최소로 하고 싶습니다.

입국심사를 기다리는 사람 수 n, 각 심사관이 한 명을 심사하는데 걸리는 시간이 담긴 배열 times가 매개변수로 주어질 때, 모든 사람이 심사를 받는데 걸리는 시간의 최솟값을 return 하도록 solution 함수를 작성해주세요.

 

 

 

 

코드

 

def check(x, n, times):
    sum=0
    for t in times:
        sum+=(x//t) # x분 동안 심사관이 받을 수 있는 사람의 수
    print(sum, n)
    if sum>=n:
        return True
    else:
        return False

def solution(n, times):
    times.sort()
    lt=1
    rt=n*times[-1]
    res=0
    while lt<=rt:
        mid=(lt+rt)//2
        if check(mid, n, times):
            rt=mid-1
            res=mid
        else:
            lt=mid+1
    return res
728x90

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

 

코딩테스트 연습 - 예산

국가의 역할 중 하나는 여러 지방의 예산요청을 심사하여 국가의 예산을 분배하는 것입니다. 국가예산의 총액은 미리 정해져 있어서 모든 예산요청을 배정해 주기는 어려울 수도 있습니다. 그��

programmers.co.kr

 

 

 

문제

 

국가의 역할 중 하나는 여러 지방의 예산요청을 심사하여 국가의 예산을 분배하는 것입니다. 국가예산의 총액은 미리 정해져 있어서 모든 예산요청을 배정해 주기는 어려울 수도 있습니다. 그래서 정해진 총액 이하에서 가능한 한 최대의 총 예산을 다음과 같은 방법으로 배정합니다.

1. 모든 요청이 배정될 수 있는 경우에는 요청한 금액을 그대로 배정합니다. 2. 모든 요청이 배정될 수 없는 경우에는 특정한 정수 상한액을 계산하여 그 이상인 예산요청에는 모두 상한액을 배정합니다. 상한액 이하의 예산요청에 대해서는 요청한 금액을 그대로 배정합니다.

예를 들어, 전체 국가예산이 485이고 4개 지방의 예산요청이 각각 120, 110, 140, 150일 때, 상한액을 127로 잡으면 위의 요청들에 대해서 각각 120, 110, 127, 127을 배정하고 그 합이 484로 가능한 최대가 됩니다.
각 지방에서 요청하는 예산이 담긴 배열 budgets과 총 예산 M이 매개변수로 주어질 때, 위의 조건을 모두 만족하는 상한액을 return 하도록 solution 함수를 작성해주세요.

 

 

 

 

코드

# 돈 계산
def Count(x, budgets):
    sum=0
    # 예산을 넘으면 상한액으로, 아니면 그대로 배정
    for b in budgets:
        if b>x:
            sum+=x
        else:
            sum+=b
    return sum
            
def solution(budgets, M):
    budgets.sort()
    lt=1
    rt=budgets[-1]
    # 이분 탐색
    while lt<=rt:
        mid=(lt+rt)//2
        if Count(mid, budgets)<=M:
            res=mid
            lt=mid+1
        else:
            rt=mid-1
    return res
728x90

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

 

코딩테스트 연습 - H-Index

H-Index는 과학자의 생산성과 영향력을 나타내는 지표입니다. 어느 과학자의 H-Index를 나타내는 값인 h를 구하려고 합니다. 위키백과1에 따르면, H-Index는 다음과 같이 구합니다. 어떤 과학자가 발표

programmers.co.kr

 

 

 

문제

H-Index는 과학자의 생산성과 영향력을 나타내는 지표입니다. 어느 과학자의 H-Index를 나타내는 값인 h를 구하려고 합니다. 위키백과1에 따르면, H-Index는 다음과 같이 구합니다.

어떤 과학자가 발표한 논문 n편 중, h번 이상 인용된 논문이 h편 이상이고 나머지 논문이 h번 이하 인용되었다면 h의 최댓값이 이 과학자의 H-Index입니다.

어떤 과학자가 발표한 논문의 인용 횟수를 담은 배열 citations가 매개변수로 주어질 때, 이 과학자의 H-Index를 return 하도록 solution 함수를 작성해주세요.

 

 

 

 

 

코드

def solution(citations):
    answer=0
    n=len(citations)
    for h in range(n+1):
        cnt=sum(x>=h for x in citations) # h번 이상 인용된 논문의 수
        if answer<cnt and cnt>=h and n-cnt<=h:
            answer=h
    return answer

 

 

 

728x90

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

 

코딩테스트 연습 - [3차] n진수 게임

N진수 게임 튜브가 활동하는 코딩 동아리에서는 전통적으로 해오는 게임이 있다. 이 게임은 여러 사람이 둥글게 앉아서 숫자를 하나씩 차례대로 말하는 게임인데, 규칙은 다음과 같다. 숫자를 0�

programmers.co.kr

 

 

 

문제

 

튜브가 활동하는 코딩 동아리에서는 전통적으로 해오는 게임이 있다. 이 게임은 여러 사람이 둥글게 앉아서 숫자를 하나씩 차례대로 말하는 게임인데, 규칙은 다음과 같다.

  1. 숫자를 0부터 시작해서 차례대로 말한다. 첫 번째 사람은 0, 두 번째 사람은 1, … 열 번째 사람은 9를 말한다.
  2. 10 이상의 숫자부터는 한 자리씩 끊어서 말한다. 즉 열한 번째 사람은 10의 첫 자리인 1, 열두 번째 사람은 둘째 자리인 0을 말한다.

이렇게 게임을 진행할 경우,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 0, 1, 1, 1, 2, 1, 3, 1, 4, …
순으로 숫자를 말하면 된다.

한편 코딩 동아리 일원들은 컴퓨터를 다루는 사람답게 이진수로 이 게임을 진행하기도 하는데, 이 경우에는
0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, …
순으로 숫자를 말하면 된다.

이진수로 진행하는 게임에 익숙해져 질려가던 사람들은 좀 더 난이도를 높이기 위해 이진법에서 십육진법까지 모든 진법으로 게임을 진행해보기로 했다. 숫자 게임이 익숙하지 않은 튜브는 게임에 져서 벌칙을 받는 굴욕을 피하기 위해, 자신이 말해야 하는 숫자를 스마트폰에 미리 출력해주는 프로그램을 만들려고 한다. 튜브의 프로그램을 구현하라.

 

 

 

 

 

코드

 

def solution(n, t, m, p):
    base=range(n) # n진법 숫자
    base=list(map(str, base))
    for i in range(n):
        base[i]=base[i].replace('10','A')
        base[i]=base[i].replace('11','B')
        base[i]=base[i].replace('12','C')
        base[i]=base[i].replace('13','D')
        base[i]=base[i].replace('14','E')
        base[i]=base[i].replace('15','F')
    
    s='' # 게임 정답
    for i in range(t*m):
        tmp=i
        num=''
        while tmp>=n:
            num+=base[tmp%n]
            tmp//=n
        num+=base[tmp]
        s+=num[::-1]
        
    answer = ''
    for i in range(len(s)):
        if i%m==0:
            answer+=s[i+(p-1)]
        if len(answer)==t:
            break
    return answer
728x90

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

프로그래머스 입국심사  (0) 2020.07.09
프로그래머스 예산  (0) 2020.07.09
프로그래머스 H-Index  (0) 2020.07.09
프로그래머스 베스트앨범  (0) 2020.07.09

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

 

코딩테스트 연습 - 베스트앨범

스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가 ��

programmers.co.kr

 

 

 

문제

스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다.

  1. 속한 노래가 많이 재생된 장르를 먼저 수록합니다.
  2. 장르 내에서 많이 재생된 노래를 먼저 수록합니다.
  3. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.

노래의 장르를 나타내는 문자열 배열 genres와 노래별 재생 횟수를 나타내는 정수 배열 plays가 주어질 때, 베스트 앨범에 들어갈 노래의 고유 번호를 순서대로 return 하도록 solution 함수를 완성하세요.

 

 

 

 

 

 문제 풀이 과정은 다음과 같다. 

  1. 속한 노래가 많이 재생된 장르를 먼저 수록합니다. -> 딕셔너리를 만든 후 값에 따라 내림차순 정렬
  2. 장르 내에서 많이 재생된 노래를 먼저 수록합니다. -> 장르 별로 리스트 작성 후 플레이 횟수 내림차순 정렬, 리스트 안의 값 index 찾아서 answer에 추가
  3. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다. -> answer에 추가하고 플레이 횟수 0으로 초기화(플레이 횟수가 같은 노래가 있을 경우 고려)

 

 

 

 

코드

 

def solution(genres, plays):
    # 장르 별 속한 노래 재생 수의 합
    d=dict()
    for i in range(len(genres)):
        d[genres[i]]=d.get(genres[i], 0)+plays[i]
    # 내림차 정렬
    d=sorted(d.items(), reverse=True, key=lambda item: item[1])
    
    answer=[]
    # 특정 장르 별로 노래 고유 번호 정리
    for k, v in d:
        tmp=[]
        for i in range(len(genres)):
            if genres[i]==k:
                tmp.append(plays[i])
        tmp.sort(reverse=True) 
        # 노래 장르 별 상위 2개 선택
        for i in range(2):
            if len(tmp)>i and tmp.count(tmp[i]):
                idx=plays.index(tmp[i])
                answer.append(idx)
                # 이미 선택된 고유 번호는 제외
                plays[idx]=0
            
    return answer

 

 

728x90