๐ ๋ฌธ์ ๋ฐ๋ก๊ฐ๊ธฐ
https://school.programmers.co.kr/learn/courses/30/lessons/258712
ํ๋ก๊ทธ๋๋จธ์ค
SW๊ฐ๋ฐ์๋ฅผ ์ํ ํ๊ฐ, ๊ต์ก์ Total Solution์ ์ ๊ณตํ๋ ๊ฐ๋ฐ์ ์ฑ์ฅ์ ์ํ ๋ฒ ์ด์ค์บ ํ
programmers.co.kr
๐ ๋ฌธ์ ์์ฝ

์น๊ตฌ๋ค ๊ฐ์ ์ ๋ฌผ์ ์ฃผ๊ณ ๋ฐ์ ๊ธฐ๋ก์ ๋ฐํ์ผ๋ก ๋ค์ ๋ฌ์ ๊ฐ์ฅ ๋ง์ ์ ๋ฌผ์ ๋ฐ๋ ์น๊ตฌ๋ ์ ๋ฌผ์ ๋ช ๊ฐ ๋ฐ์์ง ์ฐพ์์ผ ํ๋ค.
๋ค์ ๋ฌ์๋ ์๋์ ์ธ ๊ฐ์ง ์กฐ๊ฑด์ ๋ฐ๋ผ ์ ๋ฌผ์ ๋ฐ์ ์์ ์ด๋ค.
- A์ B๊ฐ ์ฃผ๊ณ ๋ฐ์ ์ ๋ฌผ์ ์๊ฐ ๋ค๋ฅด๋ฉด, ๋ ์ฌ์ด์์ ๋ ๋ง์ด ์ ๋ฌผํ๋ ์ฌ๋์ด ์ ๋ฌผ์ ํ๋ ๋ฐ๋๋ค.
- A์ B๊ฐ ์ฃผ๊ณ ๋ฐ์ ์ ๋ฌผ์ ์๊ฐ ๊ฐ๊ฑฐ๋ ๊ธฐ๋ก์ด ์์ผ๋ฉด, ์ ๋ฌผ์ง์๊ฐ ๋ ๋์ ์ฌ๋์ด ์ ๋ฌผ์ ํ๋ ๋ฐ๋๋ค.
(์ ๋ฌผ ์ง์ = ๋ด๊ฐ ์ค ์ ๋ฌผ ์ - ๋ด๊ฐ ๋ฐ์ ์ ๋ฌผ ์) - ์ฃผ๊ณ ๋ฐ์ ์ ๋ฌผ์ ์๋ ๊ฐ๊ณ , ์ ๋ฌผ์ง์๋ ๊ฐ๋ค๋ฉด, ์๋ฌด๋ ์ ๋ฌผ์ ๋ฐ์ง ์๋๋ค.
๐ฅ ์ ๋ ฅ
- friends
- ์น๊ตฌ๋ค์ ์ด๋ฆ์ ๋ด์ ๋ฌธ์์ด ๋ฐฐ์ด
- ex. ["muzi", "ryan", "frodo", "neo"]
- ๊ธธ์ด๋ 2 ์ด์ 50 ์ดํ
- ๊ฐ ์ด๋ฆ์ ์ค๋ณต ์์ด, ์ํ๋ฒณ ์๋ฌธ์๋ก ๊ตฌ์ฑ๋ ์ต๋ 10๊ธ์
- gifts
- ์ ๋ฌผ์ ์ฃผ๊ณ ๋ฐ์ ๊ธฐ๋ก์ ๋ด์ ๋ฌธ์์ด ๋ฐฐ์ด
- ex. ["muzi frodo", "ryan muzi"]
- ๊ฐ ์์๋ "๋ณด๋ธ์ฌ๋ ๋ฐ์์ฌ๋" ํํ (๊ณต๋ฐฑ์ผ๋ก ๋ณด๋ธ ์ฌ๋๊ณผ ๋ฐ์ ์ฌ๋์ ๊ตฌ๋ถ)
- ๊ธธ์ด๋ 1 ์ด์ 10,000 ์ดํ
- ๊ฐ์ ์ฌ๋์ด ์๊ธฐ ์์ ์๊ฒ ์ ๋ฌผํ๋ ๊ฒฝ์ฐ๋ ์์
๐ก ์์ด๋์ด
1๏ธโฃ ์น๊ตฌ ์ ๊ฐ์ ์ ๋ฌผ ๊ธฐ๋ก ์ ๋ฆฌ
int[][] cnt = new int[m][m];
int[] give_total = new int[m];
int[] receive_total = new int[m];
- cnt[i][j]: i๋ฒ ์น๊ตฌ๊ฐ j๋ฒ ์น๊ตฌ์๊ฒ ์ค ์ ๋ฌผ์ ์
- give_total[i]: i๋ฒ ์น๊ตฌ๊ฐ ์ ์ฒด ์น๊ตฌ๋ค์๊ฒ ์ค ์ ๋ฌผ ์
- receive_total[i]: i๋ฒ ์น๊ตฌ๊ฐ ์ ์ฒด ์น๊ตฌ๋ค๋ก๋ถํฐ ๋ฐ์ ์ ๋ฌผ ์
๐๐ป ์ด ์ ๋ณด๋ค์ ์ด์ฉํด์ ์ ๋ฌผ ๊ด๊ณ์ ์ ๋ฌผ ์ง์๋ฅผ ๋ชจ๋ ๊ณ์ฐํ ์ ์๊ฒ ์ค๋นํ๋ค.
2๏ธโฃ ์ ๋ฌผ ๊ธฐ๋ก ํ์ฑ ๋ฐ ๋์
for(int i = 0; i < n; i++){
String[] gift = gifts[i].split("\\s");
String giver = gift[0];
String receiver = gift[1];
int row = 0, col = 0;
for(int j = 0; j < m; j++){
if(giver.equals(friends[j])){
row = j;
give_total[j]++;
}
if(receiver.equals(friends[j])){
col = j;
receive_total[j]++;
}
}
cnt[row][col]++;
}
- gifts ๋ฐฐ์ด์ ์ํํ๋ฉฐ, giver์ receiver์ ์ธ๋ฑ์ค๋ฅผ friends์์ ์ฐพ๊ธฐ
- ์ด์ ๋ฐ๋ผ cnt์ give_total, receive_total์ ๋ชจ๋ ์ ๋ฐ์ดํธ ํด์ฃผ๊ธฐ
3๏ธโฃ ๋ชจ๋ ์น๊ตฌ ์์ ๋ํด ๋ค์ ๋ฌ ๋ฐ์ ์ ๋ฌผ ๊ณ์ฐ
for(int i = 0; i < m; i++){
for(int j = 0; j < m; j++){
if(i == j){
continue;
}
if(cnt[i][j] > cnt[j][i]){
answer[i]++;
}
else if(cnt[i][j] < cnt[j][i]){
answer[j]++;
}
else{
int tmp1 = give_total[i] - receive_total[i];
int tmp2 = give_total[j] - receive_total[j];
if(tmp1 > tmp2){
answer[i]++;
}
else if(tmp1 < tmp2){
answer[j]++;
}
}
}
}
- ๊ฐ ์น๊ตฌ์ (i, j)์ ๋ํด ์ ๋ฌผ์ ์ฃผ๊ณ ๋ฐ์ ๊ธฐ๋ก์ ๋น๊ต
- ์๊ธฐ ์์ ์๊ฒ ์ ๋ฌผ์ ํ ์๋ ์์ผ๋ i == j๋ผ๋ฉด ๊ฑด๋๋ฐ๊ธฐ
- ์ฃผ๊ณ ๋ฐ์ ์ ๋ฌผ ์๊ฐ ๋ค๋ฅธ ๊ฒฝ์ฐ, ์ ๋ฌผ์ ๋ ๋ง์ด ํ ์น๊ตฌ๊ฐ ๋ค์ ๋ฌ์ ์ ๋ฌผ์ ํ๋ ๋ฐ์
- ์ฃผ๊ณ ๋ฐ์ ์ ๋ฌผ ์๊ฐ ๊ฐ์ผ๋ฉด, ์ ๋ฌผ์ง์๋ฅผ ๋น๊ตํด์ ๋ ํฐ ์ชฝ์ด ์ ๋ฌผ์ ํ๋ ๋ฐ์
- ์ ๋ฌผ์ง์ ๋ง์ ๊ฐ๋ค๋ฉด ์๋ฌด๋ ์ ๋ฌผ์ ๋ฐ์ง ์์
4๏ธโฃ ๊ฐ์ฅ ๋ง์ ์ ๋ฌผ์ ๋ฐ๋ ์น๊ตฌ ์ฐพ๊ธฐ
int max = 0;
for(int i = 0; i < m; i++){
if(answer[i] > max){
max = answer[i];
}
}
return max / 2;
- ์ต์ข ์ ์ผ๋ก ๊ฐ์ฅ ๋ง์ด ๋ฐ์ ์ ๋ฌผ์ ๊ฐ์๋ฅผ max์ ์ ์ฅ
- ์ด ๋ ๋ชจ๋ (i, j) ์์ ๋ค ๋น๊ตํ๋ฉด์ ์๋ก ์ฃผ๊ณ ๋ฐ์ ์ ๋ฌผ์ ๋ ๋ฒ์ฉ ๊ณ์ฐํ๊ธฐ ๋๋ฌธ์, ๊ฒฐ๊ณผ๋ฅผ 2๋ก ๋๋ ์ ๋ฐํ
๐ฉ๐ป๐ป ์ต์ข ์ฝ๋
class Solution {
public int solution(String[] friends, String[] gifts) {
int n = gifts.length;
int m = friends.length;
int[][] cnt = new int[m][m];
int[] give_total = new int[m];
int[] receive_total = new int[m];
int[] answer = new int[m];
for(int i = 0; i < n; i++){
String[] gift = gifts[i].split("\\s");
String giver = gift[0];
String receiver = gift[1];
int row = 0, col = 0;
for(int j = 0; j < m; j++){
if(giver.equals(friends[j])){
row = j;
give_total[j]++;
}
if(receiver.equals(friends[j])){
col = j;
receive_total[j]++;
}
}
cnt[row][col]++;
}
for(int i = 0; i < m; i++){
for(int j = 0; j < m; j++){
if(i == j){
continue;
}
if(cnt[i][j] > cnt[j][i]){
answer[i]++;
}
else if(cnt[i][j] < cnt[j][i]){
answer[j]++;
}
else{
int tmp1 = give_total[i] - receive_total[i];
int tmp2 = give_total[j] - receive_total[j];
if(tmp1 > tmp2){
answer[i]++;
}
else if(tmp1 < tmp2){
answer[j]++;
}
}
}
}
int max = 0;
for(int i = 0; i < m; i++){
if(answer[i] > max){
max = answer[i];
}
}
return max / 2;
}
}
๐ ์๊ฐ ๋ณต์ก๋
1๏ธโฃ ์ ๋ฌผ ๊ธฐ๋ก ํ์ฑ ๋ฐ ๋ฐฐ์ด ๋์
for (int i = 0; i < n; i++) {
...
for (int j = 0; j < m; j++) {
if (giver.equals(friends[j])) ...
if (receiver.equals(friends[j])) ...
}
}
- ๋ฐ๊นฅ ๋ฃจํ๋ n๋ฒ
- ์์ชฝ ๋ฃจํ๋ m๋ฒ
๐๐ป ์ฌ๊ธฐ์์ ์๊ฐ ๋ณต์ก๋๋ O(n * m)
2๏ธโฃ ๋ชจ๋ ์น๊ตฌ ์์ ๋ํด ์ ๋ฌผ ๋น๊ต
for (int i = 0; i < m; i++) {
for (int j = 0; j < m; j++) {
if (i == j) continue;
...
}
}
- ๋ชจ๋ ์น๊ตฌ ์ (i != j) ๋น๊ต
๐๐ป ์ฌ๊ธฐ์์ ์๊ฐ ๋ณต์ก๋๋ O(m²)
3๏ธโฃ ์ต๋๊ฐ ๊ณ์ฐ
for (int i = 0; i < m; i++) {
...
}
- ์น๊ตฌ ์๋งํผ ์ํ
๐๐ป ์ฌ๊ธฐ์์ ์๊ฐ ๋ณต์ก๋๋ O(m)
๋ฐ๋ผ์ ์ต์ข ์๊ฐ ๋ณต์ก๋๋ O(n * m + m²)์ด๋ค.
(์ด๋ n์ ์ ๋ฌผ ๊ธฐ๋ก ์, m์ ์น๊ตฌ ์)
'๐ป ์ฝํ > ๐ JAVA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [ํ๋ก๊ทธ๋๋จธ์ค/JAVA] ์ด์ํ ์นธ (4) | 2025.08.04 |
|---|---|
| [ํ๋ก๊ทธ๋๋จธ์ค/JAVA] ๋ถ๋ ๊ฐ๊ธฐ (3) | 2025.07.30 |
| [ํ๋ก๊ทธ๋๋จธ์ค/JAVA] ๊ณต์ (1) | 2025.07.23 |
| [ํ๋ก๊ทธ๋๋จธ์ค/JAVA] ์งํ ์ ๊ธฐ (0) | 2025.07.23 |
| [ํ๋ก๊ทธ๋๋จธ์ค/JAVA] ๋์์ ์ฌ์๊ธฐ (1) | 2025.07.21 |