no image
[BOJ] [C++] 17264번 I AM IRONMAN
https://www.acmicpc.net/problem/17264 17264번: I AM IRONMAN 다들 문제 제목을 보고 요즘 가장 핫한 영화를 생각했겠지만 이 이야기는 LUL(League Us Legends) 게임에서 아이언(Iron) 티어에 있는 형동이의 슬픈 이야기이다. LUL에서 티어는 게임 실력을 판가름할 www.acmicpc.net 문제 다들 문제 제목을 보고 요즘 가장 핫한 영화를 생각했겠지만 이 이야기는 LUL(League Us Legends) 게임에서 아이언(Iron) 티어에 있는 형동이의 슬픈 이야기이다. LUL에서 티어는 게임 실력을 판가름할 수 있는 지표이다. 그중 아이언 티어는 가장 낮은 단계에 위치해 있다. 친구인 강엽이와 건홍이에게 “Iron man”이라며 게임을 못한다..
2023.11.21
no image
[BOJ] [Python] 1038번: 감소하는 수
https://www.acmicpc.net/problem/1038 1038번: 감소하는 수 음이 아닌 정수 X의 자릿수가 가장 큰 자릿수부터 작은 자릿수까지 감소한다면, 그 수를 감소하는 수라고 한다. 예를 들어, 321과 950은 감소하는 수지만, 322와 958은 아니다. N번째 감소하는 수를 www.acmicpc.net 문제 음이 아닌 정수 X의 자릿수가 가장 큰 자릿수부터 작은 자릿수까지 감소한다면, 그 수를 감소하는 수라고 한다. 예를 들어, 321과 950은 감소하는 수지만, 322와 958은 아니다. N번째 감소하는 수를 출력하는 프로그램을 작성하시오. 0은 0번째 감소하는 수이고, 1은 1번째 감소하는 수이다. 만약 N번째 감소하는 수가 없다면 -1을 출력한다. 입력 더보기 첫째 줄에 N이..
2023.11.21
no image
[BOJ] [C++] 2309번: 일곱 난쟁이
https://www.acmicpc.net/problem/2309 문제 왕비를 피해 일곱 난쟁이들과 함께 평화롭게 생활하고 있던 백설공주에게 위기가 찾아왔다. 일과를 마치고 돌아온 난쟁이가 일곱 명이 아닌 아홉 명이었던 것이다. 아홉 명의 난쟁이는 모두 자신이 "백설 공주와 일곱 난쟁이"의 주인공이라고 주장했다. 뛰어난 수학적 직관력을 가지고 있던 백설공주는, 다행스럽게도 일곱 난쟁이의 키의 합이 100이 됨을 기억해 냈다. 아홉 난쟁이의 키가 주어졌을 때, 백설공주를 도와 일곱 난쟁이를 찾는 프로그램을 작성하시오. 입력 더보기 아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력..
2023.11.20
no image
[BOJ] [Python] 10419번: 지각
https://www.acmicpc.net/problem/10419 문제 창영이는 이번학기에 어떤 교양수업을 듣고 있다. 그런데, 그 교수님은 매우 지각을 자주 하시고 게다가 수업에 지각을 하였을 경우 수업을 일찍 마쳐 주기까지 하는 것을 발견하였다. 창영이는 교수님의 지각시간 0이상의 정수 t와 수업을 일찍 마쳐주는 시간 s 사이에 다음과 같은 관계가 있음을 알았다. $s = t^2$ 문득 창영이는 수업시간 d가 주어졌을 때, 교수님이 얼마나 지각을 할 수 있는지 궁금해졌고, 여러분은 창영이를 도와서 교수님이 지각할 수 있는 최대의 시간을 알아보자. 물론, 교수님이 도착하자마자 수업을 일찍 마쳐서 수업이 끝나는 것도 가능하다. 예를 들어, 수업시간이 6분인 경우, 교수님이 2분 지각을 하면, 4분간 수..
2023.11.20
no image
[프로그래머스] [Python] (Level 2) 숫자 카드 나누기 ( + 추가적인 Test Case)
https://school.programmers.co.kr/learn/courses/30/lessons/135807 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 더보기 철수와 영희는 선생님으로부터 숫자가 하나씩 적힌 카드들을 절반씩 나눠서 가진 후, 다음 두 조건 중 하나를 만족하는 가장 큰 양의 정수 a의 값을 구하려고 합니다. 철수가 가진 카드들에 적힌 모든 숫자를 나눌 수 있고 영희가 가진 카드들에 적힌 모든 숫자들 중 하나도 나눌 수 없는 양의 정수 a 영희가 가진 카드들에 적힌 모든 숫자를 나눌 수 있고, 철수가 가진 카드들에 적힌 모든 ..
2023.11.20
no image
[프로그래머스] [Python] (Level 2) 점 찍기 ( + 추가적인 Test Case)
https://school.programmers.co.kr/learn/courses/30/lessons/140107 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 더보기 좌표평면을 좋아하는 진수는 x축과 y축이 직교하는 2차원 좌표평면에 점을 찍으면서 놀고 있습니다. 진수는 두 양의 정수 k, d가 주어질 때 다음과 같이 점을 찍으려 합니다. 원점(0, 0)으로부터 x축 방향으로 a*k(a = 0, 1, 2, 3 ...), y축 방향으로 b*k(b = 0, 1, 2, 3 ...)만큼 떨어진 위치에 점을 찍습니다. 원점과 거리가 d를 넘는 위치에는 점..
2023.11.19
no image
[프로그래머스] [Python] (Level 3) 부대복귀
https://school.programmers.co.kr/learn/courses/30/lessons/132266 문제 더보기 강철부대의 각 부대원이 여러 지역에 뿔뿔이 흩어져 특수 임무를 수행 중입니다. 지도에서 강철부대가 위치한 지역을 포함한 각 지역은 유일한 번호로 구분되며, 두 지역 간의 길을 통과하는 데 걸리는 시간은 모두 1로 동일합니다. 임무를 수행한 각 부대원은 지도 정보를 이용하여 최단시간에 부대로 복귀하고자 합니다. 다만 적군의 방해로 인해, 임무의 시작 때와 다르게 되돌아오는 경로가 없어져 복귀가 불가능한 부대원도 있을 수 있습니다. 강철부대가 위치한 지역을 포함한 총지역의 수 n, 두 지역을 왕복할 수 있는 길 정보를 담은 2차원 정수 배열 roads, 각 부대원이 위치한 서로 다..
2023.11.18
no image
[프로그래머스] [Python] (Level 2) 귤 고르기
https://school.programmers.co.kr/learn/courses/30/lessons/138476 문제 더보기 경화는 과수원에서 귤을 수확했습니다. 경화는 수확한 귤 중 'k'개를 골라 상자 하나에 담아 판매하려고 합니다. 그런데 수확한 귤의 크기가 일정하지 않아 보기에 좋지 않다고 생각한 경화는 귤을 크기별로 분류했을 때 서로 다른 종류의 수를 최소화하고 싶습니다. 예를 들어, 경화가 수확한 귤 8개의 크기가 [1, 3, 2, 5, 4, 5, 2, 3]이라고 합시다. 경화가 귤 6개를 판매하고 싶다면, 크기가 1, 4인 귤을 제외한 여섯 개의 귤을 상자에 담으면, 귤의 크기의 종류가 2, 3, 5로 총 3가지가 되며 이때가 서로 다른 종류가 최소일 때입니다. 경화가 한 상자에 담으려는..
2023.11.18
no image
[BOJ] [Python] 9440번: 숫자더하기
https://www.acmicpc.net/problem/9440 9440번: 숫자 더하기 강민이가 초등학교 3학년일 때, 담임선생님이 이런 문제를 냈었다. 숫자 1, 2, 7, 8, 9 를 사용해서 만든 두 숫자를 더했을 때, 나올 수 있는 가장 작은 수는 무엇일까요? 강민이는 이 문제의 답이 2 www.acmicpc.net 문제 강민이가 초등학교 3학년일 때, 담임선생님이 이런 문제를 냈었다. 숫자 1, 2, 7, 8, 9를 사용해서 만든 두 숫자를 더했을 때, 나올 수 있는 가장 작은 수는 무엇일까요? 강민이는 이 문제의 답이 207(78 + 129)이라고 생각했다. 그런데 선생님은 책 4페이지에 있는 비슷한 문제를 모두 풀어오라는 숙제를 내셨다. 작년부터 프로그래밍을 시작한 강민이는 이런 숙제보다..
2023.11.17
no image
[프로그래머스] [Python] (Level 3) 아방가르드 타일링 (+ 추가 test case)
https://school.programmers.co.kr/learn/courses/30/lessons/181186 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 더보기 정우는 예술적 감각이 뛰어난 타일공입니다. 그는 단순한 타일을 활용하여 불규칙하면서도 화려하게 타일링을 하곤 합니다. 어느 날 정우는 가로 길이 n, 세로 길이 3 인 판을 타일링하는 의뢰를 맡았습니다. 아방가르드한 디자인 영감이 떠오른 정우는 다음과 같은 두 가지 종류의 타일로 타일링을 하기로 결정했습니다. 각 타일은 90도씩 회전할 수 있으며 타일의 개수는 제한이 없습니다. n이..
2023.11.17
728x90

 

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

 

17264번: I AM IRONMAN

다들 문제 제목을 보고 요즘 가장 핫한 영화를 생각했겠지만 이 이야기는 LUL(League Us Legends) 게임에서 아이언(Iron) 티어에 있는 형동이의 슬픈 이야기이다. LUL에서 티어는 게임 실력을 판가름할

www.acmicpc.net

 

문제

다들 문제 제목을 보고 요즘 가장 핫한 영화를 생각했겠지만 이 이야기는 LUL(League Us Legends) 게임에서 아이언(Iron) 티어에 있는 형동이의 슬픈 이야기이다. LUL에서 티어는 게임 실력을 판가름할 수 있는 지표이다. 그중 아이언 티어는 가장 낮은 단계에 위치해 있다. 친구인 강엽이와 건홍이에게 “Iron man”이라며 게임을 못한다고 놀림당하던 형동이는 꼭 아이언 티어에서 벗어나겠다고 결심했다. 하지만 형동이는 자신의 실력으로 절대 아이언(Iron) 티어에서 벗어나지 못하는 것을 알고 있다. LUL은 두 명의 플레이어가 같이 팀이 되어하는 게임이기 때문에 자신이 못해도 게임에서 이길 수 있고 자신이 잘해도 게임은 질 수 있다. 형동이는 게임은 못하지만 머리가 매우 똑똑하여 LUL 게임을 해킹하여서 몇몇 플레이어와 같이 게임을 하게 되면 게임의 승패가 어떻게 되는지 알게 되었다. 하지만 해킹을 통하여 알아내지 못한 플레이어와 같이 게임을 하는 경우 형동이가 매우 못하기 때문에 같은 팀원이 아무리 잘해도 반드시 진다.

위와 같은 경우에서 “JIHOON”과 같이 게임을 하는 경우 20점( W = 20)을 획득하는 반면에 “GANGYEOP”이나 “MINSUNG”과 같이 게임 하는 경우 경우 15점(L = 15)을 잃게 된다. 뿐만 아니라, 해킹을 통해 알지 내지 못한 플레이어를 만나게 되는 경우 형동이가 매우 못하여지기 때문에 15점을 잃게 된다. (단, 계속 지더라도 점수는 0점 밑으로 떨어지지 않는다.)

형동이가 N번에 게임을 통해서 아이언 티어에서 탈출한 경우 형동이는 “I AM NOT IRONMAN”이라고 IRONMAN”이라고 외치지만 탈출하지 못한 경우 “I AM IRONMAN”이라고 외친다.

여기서 아이언 티어를 탈출하기 위해서 100점 (G = 100) 이상이 되어야 했다면 9번째 게임(주황색 사각형)을 하고 아이언 티어를 탈출하였기 때문에 형동이는 “I AM NOT IRONMAN”이라고 외친다. 아이언 티어에서 탈출한 경우 그 이후에 게임은 신경 쓰지 않는다.

하지만 만약 탈출하기 위해서 200점(G = 200) 이상이 되어야 한다고 했을 경우 형동이는 아이언 티어를 탈출하지 못했기 때문에 “I AM IRONMAN”이라고 외치게 된다.

과연 형동이는 게임이 끝난 후 어떤 대사를 할 지 우리가 맞춰보자.

 

입력

더보기

첫 번째 줄에는 총 게임 횟수 N과 해킹을 통해 얻은 플레이어 정보의 수 P가 주어진다. (N과 P는 1,000 이하의 자연수)

 그리고 두 번째 줄에는 이긴 경우 획득 점수 W와 졌을 때 떨어지는 점수 L, 그리고 IRON 티어에서 벗어나기 위한 점수 G가 주어진다.  (0 ≤ W, L  ≤ 100, 1 ≤ G  ≤ 100,000, 이때, W, L, G는 정수)

 그리고 다음 P개의 줄에는 플레이어의 이름과 무조건 이길 수 있는 경우 W, 무조건 지는 경우 L이라는 단어가 플레이어 이름과 쌍으로 나온다.

그리고 그 다음 N개의 줄에는 같이 게임을 하는 플레이어의 이름이 나온다.

플레이어 이름은 반드시 대문자로 나오며 길이는 20이 넘지 않는다.

 

출력

더보기

0점부터 시작하였을 때 형동이가 아이언 티어에서 벗어나지 못한 경우 "I AM IRONMAN!!", 아이언 티어에서 벗어난 경우 “I AM NOT IRONMAN!!”을 출력한다.

 

코드

#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{
	int N, P;
	vector<string> list;
	int W, L, G;
	cin >> N >> P;
	cin >> W >> L >> G;
	for (int i = 0; i < P; i++)
	{
		string name, seng;
		cin >> name >> seng;
		if (seng == "W") list.push_back(name);
	}

	int score = 0;

	for (int i = 0; i < N; i++)
	{
		string name;
		cin >> name;
		bool check = false;
		for (int i = 0; i < list.size(); i++)
		{
			if (name == list.at(i))
			{
				check = true;
				score += W;
				if (score >= G)
				{
					cout << "I AM NOT IRONMAN!!";
					return 0;
				}
			}
		}
		if (check == false)
		{
			if (score <= L) score = 0;
			else score -= L;
		}
	}
	cout << "I AM IRONMAN!!";

}

 

728x90
728x90

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

 

1038번: 감소하는 수

음이 아닌 정수 X의 자릿수가 가장 큰 자릿수부터 작은 자릿수까지 감소한다면, 그 수를 감소하는 수라고 한다. 예를 들어, 321과 950은 감소하는 수지만, 322와 958은 아니다. N번째 감소하는 수를

www.acmicpc.net

문제


음이 아닌 정수 X의 자릿수가 가장 큰 자릿수부터 작은 자릿수까지 감소한다면, 그 수를 감소하는 수라고 한다. 예를 들어, 321과 950은 감소하는 수지만, 322와 958은 아니다. N번째 감소하는 수를 출력하는 프로그램을 작성하시오. 0은 0번째 감소하는 수이고, 1은 1번째 감소하는 수이다. 만약 N번째 감소하는 수가 없다면 -1을 출력한다.

 

입력


더보기

첫째 줄에 N이 주어진다. N은 1,000,000보다 작거나 같은 자연수 또는 0이다.

 

 

출력


더보기

첫째 줄에 N번째 감소하는 수를 출력한다

 

풀이방법


조합(Combination)을 이용해 문제를 해결하였다.

1 자릿수 >> 10 Combination 1 => 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 

2 자릿수 >> 10 Combination 2 => (0,1), (0,2), (0,3) ... (8,9)

* 여기서 tuple을 뒤집어서 합친다면 (10, 20, 30, ... 98 ) 이러한 방식으로 나온다. 

이러한 방식으로 10 Combination 1 to 10 까지 배열에 추가한 뒤, 배열을 정렬하면 감소하는 수의 배열이 된다.

배열의 길이 < N + 1 인 경우 : -1 출력, 그 외의 경우 배열[N]을 출력한다.

 

코드


from itertools import combinations

ans = []
comb = list(range(10))

for i in range(1,11):
    for j in combinations(comb,i):
        ans.append(int(''.join(list(map(str,reversed((j)))))))

ans.sort()

n = int(input())

if len(ans) < n+1:
    print(-1)
else:
    print(ans[n])

 

 

728x90

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

[BOJ] [Python] 17262번: Four Squares  (1) 2023.11.21
[BOJ] [C++] 17264번 I AM IRONMAN  (2) 2023.11.21
[BOJ] [C++] 2309번: 일곱 난쟁이  (0) 2023.11.20
[BOJ] [Python] 10419번: 지각  (2) 2023.11.20
[BOJ] [Python] 9440번: 숫자더하기  (0) 2023.11.17
728x90

 

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

문제


왕비를 피해 일곱 난쟁이들과 함께 평화롭게 생활하고 있던 백설공주에게 위기가 찾아왔다. 일과를 마치고 돌아온 난쟁이가 일곱 명이 아닌 아홉 명이었던 것이다. 

아홉 명의 난쟁이는 모두 자신이 "백설 공주와 일곱 난쟁이"의 주인공이라고 주장했다. 뛰어난 수학적 직관력을 가지고 있던 백설공주는, 다행스럽게도 일곱 난쟁이의 키의 합이 100이 됨을 기억해 냈다.

아홉 난쟁이의 키가 주어졌을 때, 백설공주를 도와 일곱 난쟁이를 찾는 프로그램을 작성하시오.

 

입력


더보기

아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다.

 

출력


더보기

일곱 난쟁이의 키를 오름차순으로 출력한다. 일곱 난쟁이를 찾을 수 없는 경우는 없다.

 

풀이방법


9명의 난쟁이 중에서 2명의 난쟁이 키를 제외하는 방법을 BruteForce 방법을 이용해 계산하여 오름차순으로 출력한다.

 

코드


#include<bits/stdc++.h>
#define fastio ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
using namespace std;

typedef long long int ll;

int main()
{
  fastio;
  int K[9],sum_temp=0,i,j;
  for(int i=0;i<9;i++)
  {
    cin>>K[i];
    sum_temp+=K[i];
  }
  sort(K,K+9);
  const int sum=sum_temp;
  for(i=0;i<8;i++)
  {
    int B=0;
    for(j=i+1;j<9;j++)
    {
      if(sum-(K[i]+K[j])==100)
      {
        B=1; 
        break;
      }
    }
    if(B) break;
  }
  for(int l=0;l<9;l++)
  {
    if(i==l or j==l) continue;
    else cout<<K[l]<<"\n";
  }
}

 

728x90

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

[BOJ] [C++] 17264번 I AM IRONMAN  (2) 2023.11.21
[BOJ] [Python] 1038번: 감소하는 수  (0) 2023.11.21
[BOJ] [Python] 10419번: 지각  (2) 2023.11.20
[BOJ] [Python] 9440번: 숫자더하기  (0) 2023.11.17
[BOJ] [Python] 6593번 : 상범 빌딩  (0) 2023.11.16
728x90

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

 

문제


창영이는 이번학기에 어떤 교양수업을 듣고 있다. 그런데, 그 교수님은 매우 지각을 자주 하시고 게다가 수업에 지각을 하였을 경우 수업을 일찍 마쳐 주기까지 하는 것을 발견하였다.

창영이는 교수님의 지각시간 0이상의 정수 t와 수업을 일찍 마쳐주는 시간 s 사이에 다음과 같은 관계가 있음을 알았다.

$s = t^2$

문득 창영이는 수업시간 d가 주어졌을 때, 교수님이 얼마나 지각을 할 수 있는지 궁금해졌고, 여러분은 창영이를 도와서 교수님이 지각할 수 있는 최대의 시간을 알아보자. 물론, 교수님이 도착하자마자 수업을 일찍 마쳐서 수업이 끝나는 것도 가능하다. 예를 들어, 수업시간이 6분인 경우, 교수님이 2분 지각을 하면, 4분간 수업을 일찍 마치게 되고, 2+4=6이기 때문에 바로 수업을 끝낼 수 있다. 또 다른 예로, 수업시간이 7분인 경우 교수님이 2분 지각을 하면, 수업을 4분 일찍 마쳐줄 수 있고, 2+4≤7 이므로 가능한 경우가 되고, 교수님이 3분 지각을 하게 되면, 수업을 9분 일찍 마쳐야 되고, 3+9>7 이므로, 교수님이 3분 지각을 하는 것은 불가능하다. 따라서, 교수님은 수업시간이 7분인 경우 교수님은 최대 2분간 지각을 할 수 있다.

 

입력


더보기

창영이가 궁금한 경우의 수 T(1 ≤ T ≤ 100)가 첫 번째 줄에 주어지고, 이어서 T 개의 줄에 수업시간 d(1 ≤ d ≤ 10,000, d는 정수)가 차례대로 주어진다.

출력


더보기

수업시간에 따른 교수님이 지각할 수 있는 최대 시간 t를 정수로 구해서 출력한다.

 

풀이방법


$t$의 제곱근을 구하고 현재 시간에 지각이 가능한지 구한다.($ t + t^2 <= s$)

만약 불가능하다면 $t$를 1 빼고 계산한다.

while문 탈출할 때의 $t$ 값이 정답이다.

 

코드


import sys
input = sys.stdin.readline

def main():
    n = int(input())
    for _ in range(n):
        s = int(input())
        t = int(s**0.5)
        while (t + t**2) > s:
            t -= 1
        print(t)
if __name__ =='__main__':
    main()
728x90
728x90

 

https://school.programmers.co.kr/learn/courses/30/lessons/135807

 

프로그래머스

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

programmers.co.kr

문제

더보기

철수와 영희는 선생님으로부터 숫자가 하나씩 적힌 카드들을 절반씩 나눠서 가진 후, 다음 두 조건 중 하나를 만족하는 가장 큰 양의 정수 a의 값을 구하려고 합니다.

  1. 철수가 가진 카드들에 적힌 모든 숫자를 나눌 수 있고 영희가 가진 카드들에 적힌 모든 숫자들 중 하나도 나눌 수 없는 양의 정수 a
  2. 영희가 가진 카드들에 적힌 모든 숫자를 나눌 수 있고, 철수가 가진 카드들에 적힌 모든 숫자들 중 하나도 나눌 수 없는 양의 정수 a

예를 들어, 카드들에 10, 5, 20, 17이 적혀 있는 경우에 대해 생각해 봅시다. 만약, 철수가 [10, 17]이 적힌 카드를 갖고, 영희가 [5, 20]이 적힌 카드를 갖는다면 두 조건 중 하나를 만족하는 양의 정수 a는 존재하지 않습니다. 하지만, 철수가 [10, 20]이 적힌 카드를 갖고, 영희가 [5, 17]이 적힌 카드를 갖는다면, 철수가 가진 카드들의 숫자는 모두 10으로 나눌 수 있고, 영희가 가진 카드들의 숫자는 모두 10으로 나눌 수 없습니다. 따라서 철수와 영희는 각각 [10, 20]이 적힌 카드, [5, 17]이 적힌 카드로 나눠 가졌다면 조건에 해당하는 양의 정수 a는 10이 됩니다.

철수가 가진 카드에 적힌 숫자들을 나타내는 정수 배열 arrayA와 영희가 가진 카드에 적힌 숫자들을 나타내는 정수 배열 arrayB가 주어졌을 때, 주어진 조건을 만족하는 가장 큰 양의 정수 a를 return 하도록 solution 함수를 완성해 주세요. 만약, 조건을 만족하는 a가 없다면, 0을 return 해 주세요.

 

입출력( + 추가적인 Test Case)

arrayA arrayB result
[10, 17] [5, 20] 0
[10, 20] [5, 17] 10
[14, 35, 119] [18, 30, 102] 7
[8] [5] 0

제한사항

더보기
  • 1 ≤ arrayA의 길이 = arrayB의 길이 ≤ 500,000
  • 1 ≤ arrayA의 원소, arrayB의 원소 ≤ 100,000,000
  • arrayA와 arrayB에는 중복된 원소가 있을 수 있습니다.

풀이방법

1. array들을 set를 사용해 중복을 제거합니다.
2. arrayA, arrayB 각각의 gcdA, gcdB 를 구합니다.

3-1. arrayA를 gcdB로 나눠지면 gcdB를 0으로 바꿉니다.

3-2. arrayB를 gcdA롤 나눠지면 gcdA를 0으로 바꿉니다.

4 max(gcdA, gcdB)를 해서 값을 반환합니다.

코드

from math import gcd

def solution(arrayA,arrayB):
    answer = 0
    arrayA = list(set(arrayA))
    arrayB = list(set(arrayB))
    gcdA, gcdB = arrayA[0], arrayB[0]
    for i,j in zip(arrayA, arrayB):
        gcdA = gcd(gcdA,i)
        gcdB = gcd(gcdB,j)

    for i,j in zip(arrayA, arrayB):
        if gcdB != 0 and i % gcdB == 0 :
            gcdB = 0
        if gcdA != 0 and j % gcdA == 0:
            gcdA = 0

    return max(gcdA, gcdB)
728x90
728x90

 

https://school.programmers.co.kr/learn/courses/30/lessons/140107

 

프로그래머스

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

programmers.co.kr

문제

더보기

좌표평면을 좋아하는 진수는 x축과 y축이 직교하는 2차원 좌표평면에 점을 찍으면서 놀고 있습니다. 진수는 두 양의 정수 k, d가 주어질 때 다음과 같이 점을 찍으려 합니다.

  • 원점(0, 0)으로부터 x축 방향으로 a*k(a = 0, 1, 2, 3 ...), y축 방향으로 b*k(b = 0, 1, 2, 3 ...)만큼 떨어진 위치에 점을 찍습니다.
  • 원점과 거리가 d를 넘는 위치에는 점을 찍지 않습니다.

예를 들어, k가 2, d가 4인 경우에는 (0, 0), (0, 2), (0, 4), (2, 0), (2, 2), (4, 0) 위치에 점을 찍어 총 6개의 점을 찍습니다.

정수 k와 원점과의 거리를 나타내는 정수 d가 주어졌을 때, 점이 총 몇 개 찍히는지 return 하는 solution 함수를 완성하세요.

 

입출력( + 추가적인 Test Case)

k d result
2 4 6
1 5 26
10 5 1

 

제한사항

더보기
  • 1 ≤ k ≤ 1,000,000
  • 1 ≤ d ≤ 1,000,000

 

풀이방법

1. 0부터 d까지 간격은 k로 반복합니다.

2. 원의 좌표 공식을 이용해서 temp = (d^2 - i^2)^0.5 를 구합니다.

3. temp를 k로 나눈 몫에 1을 더하여 answer에 더합니다. 

-> answer += temp//k + 1

4. answer을 반환합니다.

 

밑에 사진은 k=2, d=7 입니다. i =2 일때 예시를 들었습니다.

i = 2 일때 k 간격만큼 유지하면서 점의 갯수는 위의 3번의 식입니다.

정리하면 temp//k + 1 입니다.

 

코드

import math

def solution(k, d):
    answer = 0
    for i in range(0,d+1,k):
        temp =math.isqrt(pow(d, 2) - pow(i, 2))
        answer += temp//k + 1
    return answer

 

728x90
728x90

https://school.programmers.co.kr/learn/courses/30/lessons/132266

문제

더보기

강철부대의 각 부대원이 여러 지역에 뿔뿔이 흩어져 특수 임무를 수행 중입니다. 지도에서 강철부대가 위치한 지역을 포함한 각 지역은 유일한 번호로 구분되며, 두 지역 간의 길을 통과하는 데 걸리는 시간은 모두 1로 동일합니다. 임무를 수행한 각 부대원은 지도 정보를 이용하여 최단시간에 부대로 복귀하고자 합니다. 다만 적군의 방해로 인해, 임무의 시작 때와 다르게 되돌아오는 경로가 없어져 복귀가 불가능한 부대원도 있을 수 있습니다.

강철부대가 위치한 지역을 포함한 총지역의 수 n, 두 지역을 왕복할 수 있는 길 정보를 담은 2차원 정수 배열 roads, 각 부대원이 위치한 서로 다른 지역들을 나타내는 정수 배열 sources, 강철부대의 지역 destination이 주어졌을 때, 주어진 sources의 원소 순서대로 강철부대로 복귀할 수 있는 최단시간을 담은 배열을 return 하는 solution 함수를 완성해 주세요. 복귀가 불가능한 경우 해당 부대원의 최단시간은 -1입니다.

 

입출력

n roads sources destination result
3 [[1,2],[2,3]] [2, 3]  1 [1, 2]
5 [[1,2],[1,4],[2,4],[2,5],[4,5]] [1, 3, 5] 5 [2, -1, 0]

 

제한사항

더보기
  • 3 ≤ n ≤ 100,000
    • 각 지역은 정수 1부터 n까지의 번호로 구분됩니다.
  • 2 ≤ roads의 길이 ≤ 500,000
    • roads의 원소의 길이 = 2
    • roads의 원소는 [a, b] 형태로 두 지역 a, b가 서로 왕복할 수 있음을 의미합니다.(1 ≤ a, b ≤ n, a ≠ b)
    • 동일한 정보가 중복해서 주어지지 않습니다.
      • 동일한 [a, b]가 중복해서 주어지지 않습니다.
      • [a, b]가 있다면 [b, a]는 주어지지 않습니다.
  • 1 ≤ sources의 길이 ≤ 500
    • 1 ≤ sources[i] ≤ n
  • 1 ≤ destination ≤ n

풀이방법

결론부터 말하자면, 다익스트라와 플로이드-워셜 알고리즘은 시간초과가 발생해서 BFS로 풀었습니다.

1. 그래프를 입력합니다.

2. 각각의 노드의 거리를 -1로 초기화합니다.

3. 도착지에서부터 출발지까지의 거리를 BFS를 이용해 계산합니다.

-> BFS를 사용할 수 있는 이유는 간선의 거리가 모두 1이므로 최소경로 알고리즘을 사용하지 않아도 됩니다.

4. sources에서 destination 거리를 costs배열에서 구해서 추가합니다.

 

코드

from collections import deque

def bfs(destination, graph, costs):
	# 도착지에서부터 출발지까지의 거리를 계산
    q = deque([destination])
    costs[destination] = 0
    while q:
        x = q.popleft()
        for node in graph[x]:
            if costs[node] == -1:
                costs[node] = costs[x] + 1
                q.append(node)
    return costs
    
def solution(n, roads, sources, destination):
	# 그래프 추가
    graph = [[] for _ in range(n + 1)]
    for start, end in roads:
        graph[start].append(end)
        graph[end].append(start)
    costs = [-1] * (n + 1)
    costs = bfs(destination, graph, costs)

    return [costs[s] for s in sources]

 

결론

최소거리라는 식만보고 다익스트라를 이용해 풀어서 시간초과가 발생했습니다.

이후 플로이드 워셜을 풀었는데 이것은 시간복잡도 n^3이었지만 혹시나 풀어봤습니다. 하지만 시간초과가 발생했습니다.

BFS를 이용해 시간초과가 발생하지 않았습니다.

다들 BFS로 풉시다!

728x90
728x90

https://school.programmers.co.kr/learn/courses/30/lessons/138476

문제

더보기

경화는 과수원에서 귤을 수확했습니다. 경화는 수확한 귤 중 'k'개를 골라 상자 하나에 담아 판매하려고 합니다. 그런데 수확한 귤의 크기가 일정하지 않아 보기에 좋지 않다고 생각한 경화는 귤을 크기별로 분류했을 때 서로 다른 종류의 수를 최소화하고 싶습니다.

예를 들어, 경화가 수확한 귤 8개의 크기가 [1, 3, 2, 5, 4, 5, 2, 3]이라고 합시다. 경화가 귤 6개를 판매하고 싶다면, 크기가 1, 4인 귤을 제외한 여섯 개의 귤을 상자에 담으면, 귤의 크기의 종류가 2, 3, 5로 총 3가지가 되며 이때가 서로 다른 종류가 최소일 때입니다.

경화가 한 상자에 담으려는 귤의 개수 k와 귤의 크기를 담은 배열 tangerine이 매개변수로 주어집니다. 경화가 귤 k개를 고를 때 크기가 서로 다른 종류의 수의 최솟값을 return 하도록 solution 함수를 작성해 주세요.

 

입출력

k tangerine result
6 [1, 3, 2, 5, 4, 5, 2, 3] 3
4 [1, 3, 2, 5, 4, 5, 2, 3] 2
2 [1, 1, 1, 1, 2, 2, 2, 3] 1

 

제한사항

더보기
  • 1 ≤ k  tangerine의 길이 ≤ 100,000
  • 1 ≤ tangerine의 원소 ≤ 10,000,000

 

풀이방법

1. Counter 라이브러리의 most_common을 사용합니다.

-> counter가 많이 나온 순서대로 정렬하여 list 형식으로 반환합니다.

(3,2)-> 3이 2번 count

2. 가장 많이 나온 숫자들부터 k-= 많이 나온 수의 횟수 반복합니다.

3. k  < 1인 경우가 되었을 때,   횟수 반복을 몇 번 했는지 기록하고 수를 반환합니다.

 

 

코드

from collections import Counter

def solution(k, tangerine):
    counter = Counter(tangerine).most_common()
    answer = 0
    for i in counter:
        if k <  1:
            break
        k -= i[1]
        answer += 1
    return answer

 

결론

그리디 알고리즘으로 많이 나온 수를 정렬합니다.

많이 나온 수부터 천천히 뺀다면 답이 나옵니다.

728x90
728x90

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

 

9440번: 숫자 더하기

강민이가 초등학교 3학년일 때, 담임선생님이 이런 문제를 냈었다. 숫자 1, 2, 7, 8, 9 를 사용해서 만든 두 숫자를 더했을 때, 나올 수 있는 가장 작은 수는 무엇일까요? 강민이는 이 문제의 답이 2

www.acmicpc.net

문제

강민이가 초등학교 3학년일 때, 담임선생님이 이런 문제를 냈었다.

숫자 1, 2, 7, 8, 9를 사용해서 만든 두 숫자를 더했을 때, 나올 수 있는 가장 작은 수는 무엇일까요?

강민이는 이 문제의 답이 207(78 + 129)이라고 생각했다. 그런데 선생님은 책 4페이지에 있는 비슷한 문제를 모두 풀어오라는 숙제를 내셨다. 

작년부터 프로그래밍을 시작한 강민이는 이런 숙제보다 코딩을 더 재밌어했다. 그래서 강민이는 이 숙제를 코딩으로 해결하기로 했다!

어린 강민이를 위해 코딩을 도와주자.

더보기

입력

한 줄에 하나씩 연습문제가 주어진다.

각 줄에서 첫 번째로 나오는 정수 N (2 ≤ N ≤ 14) 은 연습문제에서 사용될 숫자의 개수이다.

두 번째부터 사용될 N개의 숫자가 주어진다. 0이 아닌 수가 최소 2개 이상 존재한다

마지막 줄에 0을 입력하면 프로그램이 종료된다.

 

출력

각 연습문제마다 정답을 출력한다.

 

풀이방법

풀이방법은 간단합니다.

 

1. 숫자들을 정렬합니다.

-> 정렬해야 작은 수가 큰 자릿수를 차지하기 때문에 덧셈을 했을 때, 작은 수가 나옵니다.

2. 모든 0을 index가 0의 개수 + 2에 해당하는 index에 모두 넣습니다.

3. 숫자의 길이가 짝수인지 홀수인지 구합니다.

3-1. 짝수인 경우 a,b 배열에 맨 앞의 숫자 하나씩 넣습니다.

3-2. 홀수인 경우, a 배열에 0번째 index,를 넣은 뒤, a, b 배열에 번갈아 숫자를 넣습니다.

 

짝수인 경우

1 3 0 0 2 6

(정렬)

0 0 1 2 3 6

(0을 뒤로 넘김)

1 2 0 0 3 6

a배열 1 0 3, b 배열 2 0 6

-> 309

 

홀수인 경우

1 3 0 0 0 2 6

(정렬)

0 0 0 1 2 3 6

(0을 뒤로 넘김)

1 2 0 0 0 3 6

a배열 1 0 0 6 b  배열 2 0 3

->1209

 

 

코드

import sys
from collections import deque

while True:
    arr = deque(map(int, sys.stdin.readline().rstrip().split()))
    if arr[0] == 0:
        break
    arr.popleft()
    # 정렬
    arr = sorted(arr)
    zeros = 0
    for i in arr:
        if i == 0:
            zeros += 1
        else:
            break
    for i in range(zeros):
        arr.pop(0)
    for i in range(zeros):
        arr.insert(2,0)

    a, b = [], []
    if len(arr)% 2 == 0:
        for i in range(len(arr)):
            if i % 2 == 0:
                a.append(arr[i])
            else:
                b.append(arr[i])
        print(int("".join(map(str,a)))+ int("".join(map(str,b))))
    else:
        a.append(arr[0])
        for i in range(1,len(arr)):
            if i % 2 == 1:
                a.append(arr[i])
            else:
                b.append(arr[i])
        print(int("".join(map(str,a)))+ int("".join(map(str,b))))

결론

0을 뒤로 넘기는 것, 짝수와 홀수일때 수를 넘기는 것과 str, int 형변환만 잘한다면 바로 풀리는 문제입니다.

728x90
728x90

https://school.programmers.co.kr/learn/courses/30/lessons/181186

 

프로그래머스

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

programmers.co.kr

문제

더보기

정우는 예술적 감각이 뛰어난 타일공입니다. 그는 단순한 타일을 활용하여 불규칙하면서도 화려하게 타일링을 하곤 합니다.

어느 날 정우는 가로 길이 n, 세로 길이 3 인 판을 타일링하는 의뢰를 맡았습니다. 아방가르드한 디자인 영감이 떠오른 정우는 다음과 같은 두 가지 종류의 타일로 타일링을 하기로 결정했습니다.


각 타일은 90도씩 회전할 수 있으며 타일의 개수는 제한이 없습니다.

n이 주어졌을 때, 이 두 가지 종류의 타일로 n x 3 크기의 판을 타일링하는 방법의 수를 return 하도록 solution 함수를 완성해주세요.

 

입출력( + 추가적인 Test Case)

n result
1 1
2 3
3 10
4 23
5 62
6 170
7 441

제한사항

더보기
  • 1 ≤ n ≤ 100,000
  • 결과는 매우 클 수 있으므로 1,000,000,007 로 나눈 나머지를 return합니다.

풀이방법

정말 정말 힘들었습니다.... 정말 힘들었어요.. 정말로... 이상한 패턴 찾느라 고생했습니다...

 

n=1,2,3일 때 패턴
n=4,5,6일 때, unique한 패턴

이러한 패턴들을 찾아낸 뒤, dp를 이용해 풀었습니다.

 

n <= 6 일 때까지 값을 각각 dp 배열과 sum_dp 배열을 만들어 준뒤 n >= 7 부터 반복문을 통해 계산했습니다.

 

dp[n]에 대해 n-1, n-2, n-3 은 각각 1, 2, 5를 곱해서 더해주면 됩니다. 하지만 n-4, n-5, n-6은 계속 unique한 모양이 생깁니다. n = 7일 때, n=4 인 경우에 1*3막대를 가운데에 추가해야하기 때문입니다.

다시 말해서 3의 배수로 unique한 패턴이 생기기 때문에 누적 합을 저장할 배열(sum_dp) 필요합니다.

 

그래서 sum_dp[i] 는 dp[i]와 3의 배수로 증가하는 unique한 타일인 sum_dp[i-3]을 더해주면서 저장해줍니다.

 

코드

def solution(n):
    dp = [0 for _ in range(100001)]
    
    # 누적 합
    sum_dp = [0 for _ in range(100001)]

    sum_dp[1] = 1
    sum_dp[2] = 3
    sum_dp[3] = 11
    sum_dp[4] = 24
    sum_dp[5] = 65
    sum_dp[6] = 181

    dp[1] = 1
    dp[2] = 3
    dp[3] = 10
    dp[4] = 23
    dp[5] = 62
    dp[6] = 170

    for i in range(7, n+1):
    	
        dp[i] = dp[i - 1] + dp[i - 2] * 2 + dp[i - 3] * 5 + sum_dp[i - 4] * 2 + sum_dp[i - 5] * 2 + sum_dp[i - 6] * 4
        dp[i] = dp[i] % 1000000007
		
        # 누적 합 계산
        sum_dp[i] = dp[i] + sum_dp[i-3]
        sum_dp[i] = sum_dp[i] % 1000000007
    return dp[n]

결론

어렵다. 진짜 어렵다... 누적 합에 대해 다시 공부하거나 점화식에 대해 공부해봐야겠다.

728x90