https://softeer.ai/practice/6275/history?questionType=ALGORITHM
Softeer - ํ๋์๋์ฐจ๊ทธ๋ฃน SW์ธ์ฌํ๋ณดํ๋ซํผ
softeer.ai
ํ์ด๊ณผ์
์ ์ฒด์ ์ธ ํ์ด
1. ํ์ ๊ฒฝ๋ก์ ์์์ , ์์ ๋ฐฉํฅ ์ฐพ๊ธฐ
2. ์ฐพ์ ๋ฐฉํฅ์ผ๋ก dfsํ์ํ๊ธฐ
2-1. ํ์ฌ ๋ฐฉํฅ์ผ๋ก ๋ ์นธ ์ด๋ํ ์ ์๋์ง ํ์ธ
2-2. ์ค๋ฅธ์ชฝ์ผ๋ก ํ์ ์ํจ ๋ค, ๋ ์นธ ์ด๋ํ ์ ์๋์ง ํ์ธ
2-3. ์ผ์ชฝ์ผ๋ก ํ์ ์ํจ ๋ค, ๋ ์นธ ์ด๋ํ ์ ์๋์ง ํ์ธ
์์ธํ ํ์ด
์์์ ์ด ๋ ์ ์๋ ์ขํ
1. "#" ์ธ ๋ฌธ์์ด
2. ์, ํ, ์ข, ์ฐ "#" ๋ฌธ์์ด์ด ํ๋ ์์ด์ผ ํจ (๋ ๊ฐ ์ด๋ฉด ์๋จ)
์ ๋ ๊ฐ์ง ํน์ง์ ํ์ฉํด์ ๋ชจ๋ ์ขํ์ ๋ํด ํ์ํ๋ฉฐ ์์์ ์ ์ฐพ์์ต๋๋ค.
static void find_start(){
for(int i=0;i<H;i++){
for(int j=0;j<W;j++){
if(map[i][j].equals("#")){
int cnt = 0;
for(int d=0;d<4;d++){
int nr = i + dr[d];
int nc = j + dc[d];
if(is_range(nr,nc) && map[nr][nc].equals("#")){
cnt+=1;
sd = d;
if(cnt>1) break;
}
}
if(cnt==1){
sr = i;
sc = j;
return;
}
}
}
}
}
์ด๋ ์์์ ์ ์ฐพ๊ฒ ๋๋ฉด, ๋ ์ด์ ๋ค๋ฅธ ์์์ ์ ์ฐพ์ง ์์๋ ๋๋ฏ๋ก ๋ฐ๋ก ํจ์๋ฅผ ์ข ๋ฃํ์ต๋๋ค.
dfs์ ํตํด์ command ์ฐพ๊ธฐ
dfsํจ์์ ๋งค๊ฐ๋ณ์๋ก ์ขํ(r, c)์ ๋ฐฉํฅ(d)๋ฅผ ๋๊ฒจ์คฌ์ต๋๋ค.
1. ํ์ฌ ๋ฐฉํฅ์ผ๋ก ๋ ์นธ ์ด๋ํ ์ ์์ผ๋ฉด ๋ ์นธ ์ด๋ํ (nr, nc)์ ์๋ ๋ฐฉํฅ(d)์ผ๋ก dfs๋ฅผ ์ํํฉ๋๋ค.
2. ํ์ฌ ๋ฐฉํฅ์ผ๋ก ์ด๋ํ ์ ์์ผ๋ฉด ์ค๋ฅธ์ชฝ์ผ๋ก ํ์ ์ํค๊ณ , ๋ ์นธ ์ด๋ํ ์ ์๋์ง ํ์ธํ ๋ค ์๋ ์นธ(r, c)์ ๋ฐ๋ ๋ฐฉํฅ(nd)์ผ๋ก dfs๋ฅผ ์ํํฉ๋๋ค.
3. ์ค๋ฅธ์ชฝ์ผ๋ก ํ์ ์ํฌ ์ ์์ผ๋ฉด, ์ผ์ชฝ์ผ๋ก ํ์ ์ํจ ๋ค ๋ ์นธ ์ด๋ํ ์ ์๋์ง ํ์ธํ๊ณ ์๋ ์นธ(r, c)์ ๋ฐ๋ ๋ฐฉํฅ(nd)์ผ๋ก dfs๋ฅผ ์ํํฉ๋๋ค.
์ด๋, ๋ณดํต์ dfsํจ์์ ๊ฐ์ด ๋ฐฉ๋ฌธํ์ธ ๋ฐฐ์ด boolean[][] visited; ๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์์์ต๋๋ค.
์๋ํ๋ฉด, ํด๋น ๋ฌธ์ ์์๋ ์๋ ๊ฒฝ๋ก๋ฅผ ๋๋์ ๊ฐ ์ ์๋ ๊ฒฝ์ฐ๋ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. (์ง์งํ๊ฑฐ๋, 90๋ ์ฐํ์ , 90๋ ์ขํ์ )
๋ง์ฝ 180๋ ํ์ ์ด ์๋ค๋ฉด ๋ฐฉ๋ฌธ์ฒดํฌ๋ฅผ ์งํํด์ค์ผ ํ ๊ฒ ์ ๋๋ค.
dfsํจ์๊ฐ ์ข ๋ฃ๋๋ ๊ฒฝ์ฐ(base case)๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1. ํ์ฌ ์งํ๋ฐฉํฅ์ผ๋ก ์ด๋ํ ์ ์์ผ๋ฉฐ
2. ์ค๋ฅธ์ชฝ์ผ๋ก ํ์ ํ ๋ฐฉํฅ์ผ๋ก ์ด๋ํ ์ ์๊ณ
3. ์ผ์ชฝ์ผ๋ก ํ์ ํ ๋ฐฉํฅ์ผ๋ก๋ ์ด๋ํ ์ ์์ต๋๋ค.
์ด๋ ์ ๋ dfsํจ์๋ฅผ ์ฌ๊ท์ ์ผ๋ก ํ์ํ ๋, if else ๋ฌธ์ ์ฌ์ฉํ์ง ์๊ณ return๋ฌธ์ผ๋ก ์กฐ๊ฑด์ ๋ถ๊ธฐํ๊ธฐ ๋๋ฌธ์ dfsํจ์์ ๋ง์ง๋ง์ return๋ฌธ์ ์ ์ด์ base case๋ฅผ ๊ตฌํํ์ต๋๋ค.
static void find_track(int r,int c, int d){ // ํ์ฌ ๋ฐฉํฅ์ผ๋ก ๋ ์นธ ์ฉ ์ด๋๊ฐ๋ฅํ์ง ํ์ธ, ์ด๋ํ ์ ์์ผ๋ฉด ์ค๋ฅธ์ชฝ ํน์ ์ผ์ชฝ์ผ๋ก ํ์ ์ํค๊ธฐ
// ํ์ฌ ๋ฐฉํฅ์ผ๋ก ๋ ์นธ์ฉ ์ด๋์ด ๊ฐ๋ฅํ์ง ํ์ธ
int nr = r, nc = c;
int cnt = 0;
for(int i=0;i<2;i++){
nr += dr[d];
nc += dc[d];
if(is_range(nr,nc) && map[nr][nc].equals("#")){
cnt+=1;
}
}
if(cnt==2){ // ํ์ฌ ๋ฐฉํฅ์ผ๋ก ๋ ์นธ ์ด๋์ด ๊ฐ๋ฅํจ.
track.append("A");
find_track(nr,nc,d);
return;
}
// ์ค๋ฅธ์ชฝ์ผ๋ก ํ์ ์์ผ๋ณด๊ธฐ
int nd = (d + 1) % 4;
nr = r;
nc = c;
cnt = 0;
for(int i=0;i<2;i++){
nr += dr[nd];
nc += dc[nd];
if(is_range(nr,nc) && map[nr][nc].equals("#")){
cnt += 1;
}
}
if(cnt==2){
track.append("R");
find_track(r,c,nd);
return;
}
// ์ผ์ชฝ์ผ๋ก ํ์
nd = (d - 1)==-1 ? 3 : (d - 1);
nr = r;
nc = c;
cnt = 0;
for(int i=0;i<2;i++){
nr += dr[nd];
nc += dc[nd];
if(is_range(nr,nc) && map[nr][nc].equals("#")){
cnt += 1;
}
}
if(cnt==2){
track.append("L");
find_track(r,c,nd);
return;
}
return;
}
์๊ฒ๋ ์
- ๋ฌธ์ ์ ํน์ฑ์ ๋ฐ๋ผ์ dfs ์ํ ์ ๋ฐฉ๋ฌธ์ฒดํฌ๋ฅผ ์งํํ์ง ์์๋ ๋จ์ ์๊ฒ๋์์ต๋๋ค.
- ๋ฌธ์ ์ ํน์ฑ์ ์ ํ์
ํ์ฌ, ๋ ํจ์จ์ ์ผ๋ก dfs๋ฅผ ๊ตฌํํ ์ ์์์ ์๊ฒ๋์์ต๋๋ค.
- ์ ๋ ์ฒ์์ ์ ์ฒด "#"์ ๊ฐฏ์๋ฅผ ์ธ๊ณ , dfs๋ฅผ ์ํํ๋ฉฐ ๋ชจ๋ "#"์ ๋ค ํ์ํ๋ฉด ํจ์๋ฅผ ์ข ๋ฃํ๋๋ก ๊ตฌํํ๋ ค ํ์ต๋๋ค. ํ์ง๋ง ์ด๋ ๊ฒ ํ ํ์ ์์ด ๋ ์ด์ ์ด๋ํ ์ ์๋ ๊ฒฝ์ฐ dfs๋ฅผ ์ข ๋ฃํ๋ฉด ๋์ต๋๋ค.
์ ์ฒด์ฝ๋
import java.io.*;
import java.util.*;
public class Main {
static int H,W;
static String[][] map;
static int sr,sc; // ์์ ์ขํ
static int sd; // ์์ ๋ฐฉํฅ
static int[] dr = {-1,0,1,0}; // ๋ถ, ๋, ๋จ, ์
static int[] dc = {0,1,0,-1};
static StringBuilder track;
static boolean is_range(int r,int c){
if(r < 0 || r>=H) return false;
if(c < 0 || c>=W) return false;
return true;
}
static String convert_dir(int d){
if(d==0){
return "^";
}
if(d==1){
return ">";
}
if(d==2){
return "v";
}
if(d==3){
return "<";
}
return "?";
}
static void find_track(int r,int c, int d){ // ํ์ฌ ๋ฐฉํฅ์ผ๋ก ๋ ์นธ ์ฉ ์ด๋๊ฐ๋ฅํ์ง ํ์ธ, ์ด๋ํ ์ ์์ผ๋ฉด ์ค๋ฅธ์ชฝ ํน์ ์ผ์ชฝ์ผ๋ก ํ์ ์ํค๊ธฐ
// ํ์ฌ ๋ฐฉํฅ์ผ๋ก ๋ ์นธ์ฉ ์ด๋์ด ๊ฐ๋ฅํ์ง ํ์ธ
int nr = r, nc = c;
int cnt = 0;
for(int i=0;i<2;i++){
nr += dr[d];
nc += dc[d];
if(is_range(nr,nc) && map[nr][nc].equals("#")){
cnt+=1;
}
}
if(cnt==2){ // ํ์ฌ ๋ฐฉํฅ์ผ๋ก ๋ ์นธ ์ด๋์ด ๊ฐ๋ฅํจ.
track.append("A");
find_track(nr,nc,d);
return;
}
// ์ค๋ฅธ์ชฝ์ผ๋ก ํ์ ์์ผ๋ณด๊ธฐ
int nd = (d + 1) % 4;
nr = r;
nc = c;
cnt = 0;
for(int i=0;i<2;i++){
nr += dr[nd];
nc += dc[nd];
if(is_range(nr,nc) && map[nr][nc].equals("#")){
cnt += 1;
}
}
if(cnt==2){
track.append("R");
find_track(r,c,nd);
return;
}
// ์ผ์ชฝ์ผ๋ก ํ์
nd = (d - 1)==-1 ? 3 : (d - 1);
nr = r;
nc = c;
cnt = 0;
for(int i=0;i<2;i++){
nr += dr[nd];
nc += dc[nd];
if(is_range(nr,nc) && map[nr][nc].equals("#")){
cnt += 1;
}
}
if(cnt==2){
track.append("L");
find_track(r,c,nd);
return;
}
return;
}
static void find_start(){
for(int i=0;i<H;i++){
for(int j=0;j<W;j++){
if(map[i][j].equals("#")){
int cnt = 0;
for(int d=0;d<4;d++){
int nr = i + dr[d];
int nc = j + dc[d];
if(is_range(nr,nc) && map[nr][nc].equals("#")){
cnt+=1;
sd = d;
if(cnt>1) break;
}
}
if(cnt==1){
sr = i;
sc = j;
return;
}
}
}
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
H = Integer.parseInt(st.nextToken());
W = Integer.parseInt(st.nextToken());
map = new String[H][W];
track = new StringBuilder();
for(int i=0;i<H;i++){
char[] ch = br.readLine().toCharArray();
for(int j=0;j<W;j++){
map[i][j] = String.valueOf(ch[j]);
}
}
find_start();
find_track(sr,sc,sd);
System.out.printf("%d %d\n",sr+1,sc+1);
System.out.printf("%s\n",convert_dir(sd));
System.out.print(track.toString());
}
}
'๐์ฝ๋ฉํ ์คํธ:CodingTest' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์์ด(n๊ณผm ๋ฌธ์ ) ์ต์ ํ ์ํค๊ธฐ && ์กฐํฉ (0) | 2024.10.29 |
---|---|
[HSAT 4ํ ์ ๊ธฐ ์ฝ๋ฉ ์ธ์ฆํ๊ฐ ๊ธฐ์ถ] ํต๊ทผ๋ฒ์ค ์ถ๋ฐ ์์ ๊ฒ์ฆํ๊ธฐ (0) | 2024.06.28 |
[ํ๋ก๊ทธ๋๋จธ์ค] ์๋ด์ ์ธ์ (0) | 2024.06.26 |
[ํ๋ก๊ทธ๋๋จธ์ค] ๋ค๋ฆฌ๋ฅผ ์ง๋๋ ํธ๋ญ (0) | 2024.06.24 |
[PCCP ๊ธฐ์ถ๋ฌธ์ ] 2๋ฒ / ์์ ์์ถ (0) | 2024.04.30 |