์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |
- ์นด์นด์ค์ฝํ
- ํฐ์คํ ๋ฆฌ์ฑ๋ฆฐ์ง
- ๊ธฐ์ ๋ฉด์
- select
- ์ค๋ธ์
- ์๊ณ ๋ฆฌ์ฆ
- Til
- ํผ๊ณตํ
- ์ ์ฒ๊ธฐ
- java
- ์ฝํ
- ์๋ฃ๊ตฌ์กฐ
- ํ๋ก๊ทธ๋๋จธ์ค
- ์๋ฐ
- groupby
- SQL
- ์ธํ๋ฐ
- MySQL
- ํผ๊ณต๋จ
- ์๋๋ก์ด๋์คํ๋์ค
- ์คํฐ๋
- doitandroid
- ์ฝํ๋ฆฐ
- CS
- join
- Kotlin
- ์ ๋ณด์ฒ๋ฆฌ๊ธฐ์ฌ
- ์๋๋ก์ด๋
- Android
- ํผ๊ณต์ฑ๋ฆฐ์ง
- Today
- Total
Welcome! Everything is fine.
[ํ๋ก๊ทธ๋๋จธ์ค/Lv.1] ํคํจ๋ ๋๋ฅด๊ธฐ(2020 KAKAO INTERNSHIP) - Java ๋ณธ๋ฌธ
[ํ๋ก๊ทธ๋๋จธ์ค/Lv.1] ํคํจ๋ ๋๋ฅด๊ธฐ(2020 KAKAO INTERNSHIP) - Java
๊ฐ๋ฐ๊ณฐ๋ฐ 2024. 4. 23.๐ ๋ฌธ์
๐ ํ์ด
ํคํจ๋ ๊ฐ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ๋ฐฉ๋ฒ๊ณผ *, 0, #์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ชฐ๋ผ ๋ต์ ๋ณด๊ณ ํผ ๋ฌธ์ ์ด๋ค. ๋จผ์ *, 0, #์ ๋ค์๊ณผ ๊ฐ์ด ์ฐจ๋ก๋๋ก 10, 11, 12๋ก ์ค์ ํ ํ ๋ฌธ์ ๋ฅผ ํผ๋ค.
1 | 2 | 3 |
4 | 5 | 6 |
7 | 8 | 9 |
*(10) | 0(11) | #(12) |
- numbers ๋ฐฐ์ด์ ๋๋ฉด์ ์์๋๋ก ๋ฒํธ๋ฅผ ๋๋ฅด๋ฉฐ ์ผ์์ผ๋ก ๋๋ ๋์ง ์ค๋ฅธ์์ ๋๋ ๋์ง ํ๋จํ๋ค.
- ๋๋ฅธ ๋ฒํธ๊ฐ 1, 4, 7 ์ด๋ผ๋ฉด
- ์ผ์์ผ๋ก ํคํจ๋๋ฅผ ๋๋ฅด๊ณ ์ผ์์ ๋๋ฅธ ์๋ฆฌ๋ก ์ด๋์ํจ๋ค.
- ๋๋ฅธ ๋ฒํธ๊ฐ 3, 6, 9 ๋ผ๋ฉด
- ์ค๋ฅธ์์ผ๋ก ํคํจ๋๋ฅผ ๋๋ฅด๊ณ ์ค๋ฅธ์์ ๋๋ฅธ ์๋ฆฌ๋ก ์ด๋์ํจ๋ค.
- ๊ทธ ์ธ ๋ฒํธ๋ผ๋ฉด
- ์ผ์์ผ๋ก๋ถํฐ์ ๊ฑฐ๋ฆฌ์ ์ค๋ฅธ์์ผ๋ก๋ถํฐ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ค.
- ์ผ์์ผ๋ก๋ถํฐ์ ๊ฑฐ๋ฆฌ๊ฐ ๋ ํฌ๋ค๋ฉด
- ์ค๋ฅธ์์ผ๋ก ํคํจ๋๋ฅผ ๋๋ฅด๊ณ ์ค๋ฅธ์์ ๋๋ฅธ ์๋ฆฌ๋ก ์ด๋์ํจ๋ค.
- ์ค๋ฅธ์์ผ๋ก๋ถํฐ์ ๊ฑฐ๋ฆฌ๊ฐ ๋ ํฌ๋ค๋ฉด
- ์ผ์์ผ๋ก ํคํจ๋๋ฅผ ๋๋ฅด๊ณ ์ผ์์ ๋๋ฅธ ์๋ฆฌ๋ก ์ด๋์ํจ๋ค.
- ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ๋ค๋ฉด
- hand์ ๊ฐ์ ๋ฐ๋ผ ์ฒ๋ฆฌํ๋ค.
ํ๋ฆ๋ง ๋ณด๋ฉด ์ด๋ ต์ง ์์ง๋ง "์ผ์์ผ๋ก๋ถํฐ์ ๊ฑฐ๋ฆฌ์ ์ค๋ฅธ์์ผ๋ก๋ถํฐ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ค." ๋ผ๋ ๋ถ๋ถ์ ํด๊ฒฐํ์ง ๋ชปํด์ ์ด๋ ค์ ๋ค. ์ด ๋ถ๋ถ์ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํ๋ฉด ๋๋ค.
int leftDist = Math.abs(num - left) / 3 + Math.abs(num - left) % 3;
int rightDist = Math.abs(num - right) / 3 + Math.abs(num - right) % 3;
๐ ๋ค๋ฅธ ํ์ด - ์ขํ๋ก ๊ตฌํ๊ธฐ
๋ค๋ฅธ ์ฝ๋๋ค์ ์ดํด๋ณด๋ ํคํจ๋๋ฅผ ์ขํ๋ก ๋๊ณ ๊ตฌํ๋ ํ์ด๋ ์์ด ๊ธฐ๋กํด๋์ผ๋ ค๊ณ ํ๋ค. ์ด ํ์ด๋ ๋ฉ์๋๋ฅผ ๋๋ ์์ฑํ๊ธฐ ๋๋ฌธ์ ๋ ๊ฐ๋ ์ฑ์๊ณ ๊น๋ํด๋ณด์ธ๋ค! ์ด ํ์ด์์๋ ๋ค์๊ณผ ๊ฐ์ ์๋ก์ด ํด๋์ค๋ฅผ ๋ง๋ค์ด ํด๊ฒฐํ๋ค.
- Position ํด๋์ค
- ์์ ์ขํ๋ฅผ ์ ์ฅํ Position ์์ฑ์ ๋ฉ์
- ํคํจ๋๋ฅผ ๋๋ฅด๋ ์์ ๊ตฌํ๋ getFinger() ๋ฉ์๋
- ํคํจ๋์ ์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ getDistance() ๋ฉ์๋
๋จผ์ ๊ฐ๋จํ Position ํด๋์ค์ ์์ฑ์ ํจ์๋ฅผ ๋ง๋ค์๋ค.
class Position {
int row;
int col;
Position(int row, int col) {
this.row = row;
this.col = col;
}
}
solution ํจ์์ ๋ง๋ค์ด๋ Position ํด๋์ค๋ฅผ ์ด์ฉํด ์ผ์์ ์์น๋ฅผ ์ ์ฅํ left, ์ค๋ฅธ์์ ์์น๋ฅผ ์ ์ฅํ right, ๋๋ฅผ ๋ฒํธ์ ์์น๋ฅผ ์ ์ฅํ numPos ๋ณ์๋ฅผ ๋ง๋ ๋ค. ๊ทธ๋ฆฌ๊ณ ๋์ left์ right๋ฅผ ์ด๊ธฐํํ๋ค. ์ผ์์ *, ์ฆ ์ขํ์ (3, 0)์ ์์นํ๊ณ ์ค๋ฅธ์์ #, ์ฆ ์ขํ์ (3, 2)์ ์์นํ๋ค.
Position left;
Position right;
Position numPos;
public String solution(int[] numbers, String hand) {
StringBuilder answer = new StringBuilder();
left = new Position(3, 0);
right = new Position(3, 2);
return answer.toString();
}
ํท๊ฐ๋ฆฌ๋ฉด ์๋์ ๊ฐ์ด ์ขํ๋ฅผ ์ ์ ๊ทธ๋ฆผ์ ๊ทธ๋ ค๋๊ณ ์๊ฐํด๋ณด์.
(0, 0) | (0, 1) | (0, 2) |
(1, 0) | (1, 1) | (1, 2) |
(2, 0) | (2, 1) | (2, 2) |
(3, 0) | (3, 1) | (3, 2) |
๊ทธ๋ฆฌ๊ณ ๋์ numbers ๋ฐฐ์ด์ ๋๋ฉด์ ์ซ์๋ฅผ ๋๋ฅผ ์๊ฐ๋ฝ์ ์ ํ๊ณ , answer์ ์ ํ ์๊ฐ๋ฝ์ ์ ์ฅํ ํ ์๊ฐ๋ฝ ์์น๋ฅผ ์ด๋ํ๋ ๊ณผ์ ์ด๋ค. numPos์ ์ขํ๋ฅผ ๋ค์๊ณผ ๊ฐ์ ์์ผ๋ก ๊ตฌํ๋ค.(์์์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ๋ฐฉ์๊ณผ ์ ์ฌํ๋ค.)
for (int num : numbers) {
numPos = new Position((num - 1) / 3, (num - 1) % 3); // numPos์ ์ขํ ๊ตฌํ๊ธฐ
if (num == 0) numPos = new Position(3, 1); // ๋ฒํธ๊ฐ 0์ด๋ผ๋ฉด ์ขํ๋ฅผ (3, 1)๋ก ๋ฃ์ด์ฃผ๊ธฐ
String finger = numPos.getFinger(hand); // ๋ฒํธ๋ฅผ ๋๋ฅผ ์๊ฐ๋ฝ ์ ํ๊ธฐ
answer.append(finger);
if (finger.equals("L")) left = numPos;
else right = numPos;
}
๋ค์์ Position ํด๋์ค ์์ ์๋ getFinger() ๋ฉ์๋์ getDistance() ๋ฉ์๋์ด๋ค. hand๋ฅผ ์ด์ฉํด finger๋ฅผ ์ด๊ธฐํํ๊ณ ์๊ธฐ ๋๋ฌธ์ if๋ฌธ์ ๊ทธ๋ฅ ๋น ์ ธ๋์ค๋๋ผ๋ ์๊ด์๋ค. col์ด 0์ด๋ฉด 1, 4, 7์ด๊ธฐ ๋๋ฌธ์ ์ผ์์ผ๋ก ๋๋ฅด๊ณ , col์ด 2๋ผ๋ฉด 3, 6, 9์ด๊ธฐ ๋๋ฌธ์ ์ค๋ฅธ์์ผ๋ก ๋๋ฅธ๋ค. ๋ ๋ค ์๋๋ผ๋ฉด else๋ฌธ์ผ๋ก ๋์ ๊ฐ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํด ๋ ๊ฐ๊น์ด ์ชฝ์ ์์ ๋ฐํํ๋ค. ์ฐธ๊ณ ๋์ ์๋ ์ ํ๋ธ ์์์ ๋ณด๋ฉด ๋ ์ดํด๊ฐ ์ ๊ฐ ๊ฒ์ด๋ค.
public String getFinger(String hand) {
String finger = hand.equals("right") ? "R" : "L";
if (this.col == 0) finger = "L";
else if (this.col == 2) finger = "R";
else {
int leftDist = left.getDistance(this);
int rightDist = right.getDistance(this);
if (leftDist < rightDist) finger = "L";
else if (rightDist < leftDist) finger = "R";
}
return finger;
}
public int getDistance(Position p) {
return Math.abs(this.row - p.row) + Math.abs(this.col - p.col);
}
๐ ์ ์ฒด ์ฝ๋
์ฒซ ๋ฒ์งธ ์ฝ๋
class Solution {
public String solution(int[] numbers, String hand) {
StringBuilder answer = new StringBuilder();
int left = 10;
int right = 12;
for (int num : numbers) {
if (num == 1 || num == 4 || num == 7) {
answer.append('L');
left = num;
} else if (num == 3 || num == 6 || num == 9) {
answer.append('R');
right = num;
} else {
if (num == 0) num = 11;
int leftDist = Math.abs(num - left) / 3 + Math.abs(num - left) % 3;
int rightDist = Math.abs(num - right) / 3 + Math.abs(num - right) % 3;
if (leftDist > rightDist) {
answer.append('R');
right = num;
} else if (leftDist < rightDist) {
answer.append('L');
left = num;
} else {
if (hand.equals("right")) {
answer.append('R');
right = num;
} else {
answer.append('L');
left = num;
}
}
}
}
return answer.toString();
}
}
๋ ๋ฒ์งธ ์ฝ๋
class Solution {
Position left;
Position right;
Position numPos;
public String solution(int[] numbers, String hand) {
StringBuilder answer = new StringBuilder();
// 1. ์ผ์, ์ค๋ฅธ์ ์์น ์ด๊ธฐํ
left = new Position(3, 0);
right = new Position(3, 2);
for (int num : numbers) {
// 2. ์ซ์๋ฅผ ๋๋ฅผ ์๊ฐ๋ฝ ์ ํ๊ธฐ
numPos = new Position((num - 1) / 3, (num - 1) % 3);
if (num == 0) numPos = new Position(3, 1);
String finger = numPos.getFinger(hand);
//3. ์ ํด์ง ์๊ฐ๋ฝ์ answer์ ๋ฌ๊ณ , ์๊ฐ๋ฝ ์์น ์ด๋
answer.append(finger);
if (finger.equals("L"))
left= numPos;
else
right = numPos;
}
return answer.toString();
}
class Position {
int row;
int col;
Position(int row, int col) {
this.row = row;
this.col = col;
}
public String getFinger(String hand) {
String finger = hand.equals("right") ? "R" : "L";
if (this.col == 0) finger = "L";
else if (this.col == 2) finger = "R";
else {
int leftDist = left.getDistance(this);
int rightDist = right.getDistance(this);
if (leftDist < rightDist)
finger = "L";
else if (rightDist < leftDist)
finger = "R";
}
return finger;
}
public int getDistance(Position p) {
return Math.abs(this.row - p.row) + Math.abs(this.col - p.col);
}
}
}
์ฐธ๊ณ